ReferenceError: a busca não está definida

177

Eu tenho esse erro ao compilar meu código no node.js, como corrigi-lo?

RefernceError: a busca não está definida

insira a descrição da imagem aqui

Esta é a função que estou executando, é responsável pela recuperação de informações de um banco de dados de filmes específico.

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
fonte
4
Bem-vindo ao SO, forneça os detalhes sobre o que você tentou até agora? Forneça um exemplo mínimo, completo e verificável sempre que necessário. Leia também Como perguntar
pratibha
3
fetchnão é um método nodejs padrão - você precisanode-fetch
Jaromanda X
3
fetch()foi projetado para o navegador e depois portado para node.js em um módulo de terceiros que aparentemente está faltando. O request()ou request-promise()biblioteca é mais nativamente construído para node.js e suporta uma gama muito maior de opções para node.js incluindo riachos, um zilhão de métodos de autenticação, etc ...
jfriend00

Respostas:

315

A API de busca não está implementada no Nó.

Você precisa usar um módulo externo para isso, como busca de nó .

Instale-o no aplicativo Node como este

npm i node-fetch --save

em seguida, coloque a linha abaixo na parte superior dos arquivos em que você está usando a API de busca:

const fetch = require("node-fetch");
Adrian T
fonte
21
varé mutável, eu recomendo que constdeve ser usado em vez disso ...
Edwin Pratt
3
@ jasa1704 você poderia escolher uma resposta?
tecnocrata 15/01
36

Se precisar ser acessível com um escopo global

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

Esta é uma correção rápida e suja, tente eliminar o uso no código de produção.

Lorem Ipsum Dolor
fonte
1
Essa foi a única maneira de conseguir que o WebStorm reconhecesse a promessa retornada fetche preenchesse automaticamente os métodos disponíveis. Concordou que deveria ser evitado na produção, mas muito útil para os desenvolvedores locais!
FoxMulder900
18

Você pode usar cross-fetch de @lquixada

Independente da plataforma: navegadores, nó ou reação nativa

Instalar

npm install --save cross-fetch

Uso

Com promessas:

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

Com assí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
fonte
Isso ajudou a API do metaweather, bem explicada na documentação do github. Obrigado por compartilhar
krupesh Anadkat
O uso do polyfill do crossfetch também funcionou para mim, usando o texto datilografado e o nó e recebendo o ReferenceError: fetch is not definederro de amazon-cognito-identity-js.
John Hamelink 22/05/19
7

Para aqueles que também usam datilografado no node-js e estão recebendo um ReferenceError: fetch is not definederro

npm install estes pacotes:

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

Em seguida, inclua:

import Global = NodeJS.Global;
export interface GlobalWithCognitoFix extends Global {
    fetch: any
}
declare const global: GlobalWithCognitoFix;
global.fetch = require('node-fetch');
circuito fechado
fonte
28
amazon-cognito-identity-jsnão é relevante para esta pergunta e não é necessário instalar para solucionar esse erro. Também não está relacionado ao texto datilografado.
#
Oi! Então, estou tendo exatamente o mesmo problema, mas isso ainda não resolve nada, você tem algum outro trabalho?
Masnad Nihit
5

Você precisa usar o isomorphic-fetchmódulo no seu Nodeprojeto porque Nodeainda não contém Fetch API. Para corrigir este problema, execute o comando abaixo:

npm install --save isomorphic-fetch es6-promise

Após a instalação, use o código abaixo no seu projeto:

import "isomorphic-fetch"

Espero que esta resposta ajude você.

AmerllicA
fonte
6
Não é mantido ativamente; Faz anos desde o último PR aceito. github.com/matthew-andrews/isomorphic-fetch/graphs/contributors
tomByrer
5

O melhor é a biblioteca do Axios para buscar. use npm i --save axiosfor installng e use-o como buscar, basta escrever axios em vez de buscar e obter resposta em then () .

Mohammad Quanit
fonte
4

O Node.js não implementou o método fetch (), mas você pode usar um dos módulos externos desse fantástico ambiente de execução para JavaScript.

Em uma das respostas acima, "busca de nó" é citada e é uma boa escolha.

Na pasta do seu projeto (o diretório em que você possui os scripts .js), instale esse módulo com o comando:

npm eu busca de nó - salvar

Em seguida, use-o como uma constante no script que você deseja executar com o Node.js, algo como isto:

busca constante = require ("busca do nó");

Miguel Murillo
fonte
1

Este é o problema relacionado ao github Este bug está relacionado à versão 2.0.0, você pode resolvê-lo simplesmente atualizando para a versão 2.1.0. Você pode correr npm i [email protected]

asma
fonte
0

O seguinte funciona para mim no Node.js.x:

npm i node-fetch;

para inicializar a instância do Dropbox:

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

por exemplo, fazer upload de um conteúdo (um método assíncrono usado neste caso):

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