Node 中 ReferenceError: fetch is not define 错误

“ReferenceError: fetch is not defined”发生在 fetch() 方法不被支持的环境中——最常见的是 NodeJs。 要解决该错误,需要安装并导入 node-fetch 包,该包在 NodeJs 运行时提供了一个 fetch() 兼容的 API。

要解决“ReferenceError: fetch is not defined”,安装并导入 node-fetch 包。

如果我们的项目没有 package.json 文件,请在项目的根目录中创建一个:

# 👇️ 只有当你还没有 package.json 文件时才运行它
$ npm init -y

现在安装 node-fetch 库。

$ npm install node-fetch

现在我们可以像在浏览器中使用 fetch() 方法一样导入和使用该模块。

import fetch from 'node-fetch';

async function getUser() {
  try {
    const response = await fetch('https://randomuser.me/api/');

    if (!response.ok) {
      throw new Error(`Error! status: ${response.status}`);
    }

    const result = await response.json();
    return result;
  } catch (err) {
    console.log(err);
  }
}

console.log(await getUser());

在撰写本文时,要在 NodeJs 项目中使用 ES6 模块导入和导出,我们必须在 package.json 文件中将类型属性设置为 module:

{
  "type": "module",
  // ... 👇️ rest
}

如果我们使用 TypeScript,则不必为 node-fetch 包安装类型,因为它们是默认包含的。

如果我运行我的 NodeJs 脚本,我会通过调用 API 获得结果。


Node 中 ReferenceError: fetch is not define 错误

仅当我们使用较旧的 NodeJs 版本并希望使用 require 语法而不是导入/导出时才这样做。

$ npm install node-fetch@2

我们安装了 node-fetch 包的第 2 版。

确保我们的 package.json 文件中没有将 type 属性设置为 module。

现在我们可以使用较旧的 require 函数导入 fetch 包。

// 👇️ Using older require syntax
const fetch = require('node-fetch');

async function getUser() {
  try {
    const response = await fetch('https://randomuser.me/api/');

    if (!response.ok) {
      throw new Error(`Error! status: ${response.status}`);
    }

    const result = await response.json();
    return result;
  } catch (err) {
    console.log(err);
  }
}

我们必须安装 node-fetch 包的版本 2 才能在我们的 NodeJs 应用程序中使用 require 语法。

最好与客户端和服务器端代码之间的导入保持一致。 但是,如果我们必须支持旧版本的 NodeJs,这种方法就可以完成工作。