ReferenceError: fetch 未定义

IT技术 javascript node.js
2021-02-04 23:07:26

在 node.js 中编译代码时出现此错误,我该如何解决?

引用错误:未定义提取

在此处输入图片说明

这是我正在做的功能,它负责从特定的电影数据库中恢复信息。

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);
  });   
}
6个回答

获取API未在节点中实现。

您需要为此使用外部module,例如node-fetch

像这样将其安装在您的 Node 应用程序中

npm install node-fetch

然后将下面的行放在您使用 fetch API 的文件的顶部:

import fetch from "node-fetch";
按照这些说明,我必须使用.mjs扩展名保存我的文件才能使其工作。
2021-04-05 23:07:26

这是一个快速的肮脏修复,请尝试在生产代码中消除这种用法。

如果fetch必须在全局范围内访问

import fetch from 'node-fetch'
globalThis.fetch = fetch
这是我能够让 WebStorm 识别由fetch可用方法返回的Promise并自动完成可用方法的唯一方法。同意在生产中应该避免它,但对本地开发非常有帮助!
2021-03-30 23:07:26
@FoxMulder900 这就是您可以在没有全局定义的情况下仍然拥有 IntelliSense 的方式: const nodeFetch = require('node-fetch') as typeof fetch;
2021-03-31 23:07:26

您可以使用来自@lquixada 的交叉提取

平台不可知:浏览器、节点或本机react

安装

npm install --save cross-fetch

用法

Promise:

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

使用异步/等待:

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);
  }
})();
这有助于 metaweather api,在 github 文档中有很好的解释。感谢分享
2021-03-15 23:07:26
使用 crossfetch 的 polyfill 也适用于我使用 typescript 和 node 并ReferenceError: fetch is not definedamazon-cognito-identity-js.
2021-03-23 23:07:26

如果你想避免 npm install 而不是在浏览器中运行,你也可以使用 nodejs https module;

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);
})
请记住.end()在此代码段的底部添加以实际启动请求。查看文档
2021-04-12 23:07:26

您应该在文件中添加此导入:

import * as fetch from 'node-fetch';

然后,运行此代码以添加node-fetch
$ yarn add node-fetch

如果您正在使用typescript,请安装 node-fetch 类型:
$ yarn add @types/node-fetch

我当然做到了,这是关于使用 es6importrequire. 似乎node-fetch不支持这种现代导入语法。
2021-03-24 23:07:26
如果我以这种方式导入并使用typescript,则会出现此错误TS2349: This expression is not callable. Type 'typeof import("/node_modules/@types/node-fetch/index")' has no call signatures.它仅适用于require.
2021-03-25 23:07:26
运行$ yarn add @types/node-fetch以安装节点获取类型
2021-03-29 23:07:26