javascript - ReferenceError: fetch är inte definierad
Jag får detta fel när jag kompilerar min kod i node.js, hur kan jag åtgärda det?
ReferenceError: fetch är inte definierad
Detta är funktionen jag gör, den är ansvarig för att återställa information från en specifik filmdatabas.
function getMovieTitles(substr){
pageNumber=1;
let url = 'https://jsonmock.hackerrank.com/api/movies/search/?Title=' + substr + "&page=" + pageNumber;
fetch(url).then((resp) => resp.json()).then(function(data) {
let movies = data.data;
let totPages = data.total_pages;
let sortArray = [];
for(let i=0; i<movies.length;i++){
sortArray.push(data.data[i].Title);
}
for(let i=2; i<=totPages; i++){
let newPage = i;
let url1 = 'https://jsonmock.hackerrank.com/api/movies/search/?Title=' + substr + "&page=" + newPage;
fetch(url1).then(function(response) {
var contentType = response.headers.get("content-type");
if(contentType && contentType.indexOf("application/json") !== -1) {
return response.json().then(function(json) {
//console.log(json); //uncomment this console.log to see the JSON data.
for(let i=0; i<json.data.length;i++){
sortArray.push(json.data[i].Title);
}
if(i==totPages)console.log(sortArray.sort());
});
} else {
console.log("Oops, we haven't got JSON!");
}
});
}
})
.catch(function(error) {
console.log(error);
});
}
Svar #1
Om du använder en version av Node före 18 är fetch-API:et inte implementerat direkt och du måste använda en extern modul för det, som node-fetch.
Installera det i din Node-applikation så här
npm install node-fetch
lägg sedan raden nedan högst upp i de filer där du använder fetch API:
import fetch from "node-fetch";
Om din applikation inte kan uppdateras för att använda ESM (även kallat import-syntax), och du behöver använda CommonJS (även kallat require), bör du fortsätta med v2 av node-fetch. Enligt deras README kommer v2 fortsätta att få kritiska buggfixar.
npm install node-fetch@2
och då kommer detta att fungera,
const fetch = require("node-fetch");
Svar #2
Detta är en snabb och enkel lösning, försök att eliminera denna användning i produktionskod.
Om fetch måste vara tillgänglig med global räckvidd
import fetch from 'node-fetch'
globalThis.fetch = fetch
Svar #3
Du kan använda cross-fetch från @lquixada
Plattformsoberoende: webbläsare, Node eller React Native
Installera
npm install --save cross-fetch
Användning
Med löften:
import fetch from 'cross-fetch';
// Or just: import 'cross-fetch/polyfill';
fetch('//api.github.com/users/lquixada')
.then(res => {
if (res.status >= 400) {
throw new Error("Bad response from server");
}
return res.json();
})
.then(user => {
console.log(user);
})
.catch(err => {
console.error(err);
});
Med async/await:
import fetch from 'cross-fetch';
// Or just: import 'cross-fetch/polyfill';
(async () => {
try {
const res = await fetch('//api.github.com/users/lquixada');
if (res.status >= 400) {
throw new Error("Bad response from server");
}
const user = await res.json();
console.log(user);
} catch (err) {
console.error(err);
}
})();
Svar #4
Om du vill undvika npm install och inte köra i webbläsaren, kan du också använda Node.js https-modulen;
const https = require('https')
const url = "https://jsonmock.hackerrank.com/api/movies";
https.get(url, res => {
let data = '';
res.on('data', chunk => {
data += chunk;
});
res.on('end', () => {
data = JSON.parse(data);
console.log(data);
})
}).on('error', err => {
console.log(err.message);
})
Från och med Node version 18 är Fetch API tillgängligt (Stabil i version 21.x) https://nodejs.org/docs/latest-v21.x/api/globals.html#fetch
// Promise version:
const url = "https://jsonmock.hackerrank.com/api/movies";
fetch(url).then(res => {
return res.json();
}).then(data => {
console.log('DATA: ', data);
})
ELLER
// async/await version
const url = "https://jsonmock.hackerrank.com/api/movies";
const getData = async () => {
const response = await fetch(url);
if (response.ok) {
const data = await response.json();
console.log('DATA: ', data);
}
};
getData();
Svar #5
fetch kom till Node v17 under den experimentella flaggan --experimental-fetch
Det kommer att vara tillgängligt i Node v18 utan flaggan.
https://github.com/nodejs/node/pull/41749#issue-1118239565
Du behöver inte längre installera något ytterligare paket
Svar #6
REDIGERAD - Ny lösning
För att använda den senaste versionen (3.0.0) måste du göra importen så här:
const fetch = (url) => import('node-fetch').then(({default: fetch}) => fetch(url));
Gammalt svar:
Detta må kanske inte vara den bästa lösningen, men om du installerar denna version :
npm install [email
du kan nu använda raden nedan utan fel.
const fetch = require("node-fetch");
Svar #7
Node.js har inte implementerat fetch()-metoden, men du kan använda ett av de externa modulerna för denna fantastiska exekveringsmiljö för JavaScript.
I ett av de andra svaren nämns "node-fetch" och det är ett bra val.
I din projektmapp (mappen där du har .js-skripten) installera det där modulen med kommandot:
npm i node-fetch --save
Använd det sedan som en konstant i det skript du vill köra med Node.js, något i stil med detta:
const fetch = require("node-fetch");
Svar #8
Du bör lägga till denna import i din fil:
import * as fetch from 'node-fetch';
Och sedan, kör denna kod för att lägga till node-fetch:
$ yarn add node-fetch
Om du arbetar med TypeScript, installera då node-fetch-typer:
$ yarn add @types/node-fetch
