ReferenceError: fetch no está definido

178

Tengo este error cuando compilo mi código en node.js, ¿cómo puedo solucionarlo?

RefernceError: fetch no está definido

ingrese la descripción de la imagen aquí

Esta es la función que estoy haciendo, es responsable de recuperar información de una base de datos de películas específica.

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);
  });   
}
jasa1704
fuente
44
Bienvenido a SO, proporcione los detalles de lo que ha probado hasta ahora. Proporcione un ejemplo mínimo, completo y verificable donde sea necesario. También tómese el tiempo para leer Cómo preguntar
pratibha
3
fetchno es un método estándar de nodejs - usted necesitanode-fetch
Jaromanda X
3
fetch()fue diseñado para el navegador y luego se transfirió a node.js en un módulo de terceros que aparentemente falta. El request()o la request-promise()biblioteca se construyó más de forma nativa para Node.js y es compatible con una gama mucho más amplia de opciones para Node.js incluyendo arroyos, un trillón de métodos de autenticación, etc ...
jfriend00

Respuestas:

317

La API de búsqueda no está implementada en Node.

Necesitas usar un módulo externo para eso, como node-fetch .

Instálelo en su aplicación Node como esta

npm i node-fetch --save

luego coloque la línea a continuación en la parte superior de los archivos donde está utilizando la API de recuperación:

const fetch = require("node-fetch");
Adrian T
fuente
21
vares cambiante, recomendaría que constse use en su lugar ...
Edwin Pratt
3
@ jasa1704 ¿podría elegir una respuesta?
tecnocrata
36

Si tiene que ser accesible con un alcance global

global.fetch = require("node-fetch");

Esta es una solución rápida y sucia, intenta eliminar el uso en el código de producción.

Lorem Ipsum Dolor
fuente
1
Esta fue la única forma en que pude hacer que WebStorm reconociera la promesa devuelta fetchy completara automáticamente los métodos disponibles. Convino en que debería evitarse en la producción, ¡pero muy útil para el desarrollador local!
FoxMulder900
18

Puede usar la búsqueda cruzada de @lquixada

Agnóstico de plataforma: navegadores, nodo o reacción nativa

Instalar en pc

npm install --save cross-fetch

Uso

Con promesas:

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);
  });

Con asíncrono / espera:

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);
  }
})();
Richard Vergis
fuente
Esto ayudó para metaweather api, bien explicado en la documentación de github. Gracias por compartir
krupesh Anadkat
El uso de polyfill de crossfetch también funcionó para mí usando typecript y node y recibiendo el ReferenceError: fetch is not definederror de amazon-cognito-identity-js.
John Hamelink
7

Para aquellos que también usan mecanografiado en node-js y están obteniendo unReferenceError: fetch is not defined error

npm install estos paquetes:

    "amazon-cognito-identity-js": "3.0.11"
    "node-fetch": "^2.3.0"

Luego incluye:

import Global = NodeJS.Global;
export interface GlobalWithCognitoFix extends Global {
    fetch: any
}
declare const global: GlobalWithCognitoFix;
global.fetch = require('node-fetch');
bucle cerrado
fuente
28
amazon-cognito-identity-jsno es relevante para esta pregunta y no es necesario instalarlo para resolver este error. Tampoco está relacionado con el mecanografiado.
cnvzmxcvmcx
¡Hola! Así que estoy teniendo exactamente el mismo problema, pero esto aún no soluciona nada, ¿tiene alguna otra solución?
Masnad Nihit
5

Tienes que usar el isomorphic-fetchmódulo para tu Nodeproyecto porque Nodetodavía no lo contiene Fetch API. Para solucionar este problema, ejecute el siguiente comando:

npm install --save isomorphic-fetch es6-promise

Después de la instalación, use el siguiente código en su proyecto:

import "isomorphic-fetch"

Espero que esta respuesta te ayude.

AmerllicA
fuente
66
No mantenido activamente; Han pasado años desde la última PR aceptada. github.com/matthew-andrews/isomorphic-fetch/graphs/contributors
tomByrer
5

La mejor es la biblioteca Axios para buscar. use npm i --save axiospara installng y úselo como fetch, solo escriba axios en lugar de fetch y luego obtenga la respuesta en then () .

Mohammad Quanit
fuente
4

Node.js no ha implementado el método fetch (), pero puede usar uno de los módulos externos de este fantástico entorno de ejecución para JavaScript.

En una de las respuestas anteriores, se cita "node-fetch" y esa es una buena opción.

En su carpeta de proyecto (el directorio donde tiene los scripts .js) instale ese módulo con el comando:

npm i node-fetch --save

Luego, úselo como una constante en el script que desea ejecutar con Node.js, algo como esto:

const fetch = require ("nodo-fetch");

Miguel Murillo
fuente
2

Este es el problema relacionado con github Este error está relacionado con la versión 2.0.0, puede resolverlo simplemente actualizando a la versión 2.1.0. Tu puedes correr npm i [email protected]

asma
fuente
0

Lo siguiente funciona para mí en Node.js 12.x:

npm i node-fetch;

para inicializar la instancia de Dropbox:

var Dropbox = require("dropbox").Dropbox;
var dbx = new Dropbox({
   accessToken: <your access token>,
   fetch: require("node-fetch")    
});

para, por ejemplo, cargar un contenido (un método asincrónico utilizado en este caso):

await dbx.filesUpload({
  contents: <your content>,
  path: <file path>
});
Pavel Muzik
fuente