require('node-fetch') 给出 ERR_REQUIRE_ESM

require('node-fetch') gives ERR_REQUIRE_ESM

我刚用

const fetch = require('node-fetch')

然后我得到

Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\Alex\Desktop\rollbot\node_modules\node-fetch\src\index.js from C:\Users\Alex\Desktop\rollbot\index.js not supported.
Instead change the require of C:\Users\Alex\Desktop\rollbot\node_modules\node-fetch\src\index.js in C:\Users\Alex\Desktop\rollbot\index.js to a 
dynamic import() which is available in all CommonJS modules.
{
  code: 'ERR_REQUIRE_ESM'
}

我的所有其他包都有效,只有 node-fetch 可以。我应该怎么做才能使用 node-fetch?

来自node-fetch package readme:

node-fetch is an ESM-only module - you are not able to import it with require. We recommend you stay on v2 which is built with CommonJS unless you use ESM yourself. We will continue to publish critical bug fixes for it.

如果你想 require 它,然后降级到 v2。

您的另一个选择是使用异步 import('node-fetch').then(...)

就我而言,我个人发现 require ('cross-fetch') 更容易。文档在这里:cross-fetch

它可以在 CommonJS 和 ES6 模块中使用。

我发现最新版本的node-fetch默认改成了ES模块。您可以:

  1. npm uninstall node-fetch
  2. 卸载node-fetch的当前版本
  3. 安装第二个版本:npm install node-fetch@2

它对我有用!

2022 年 5 月最新更新

您可能不再需要 node-fetch

在最新版本的 Node.js (18.0.0) 中,默认启用全局提取(实验性)。

const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {
  const data = await res.json();
  console.log(data);
}

通过此添加,可以使用以下全局变量:fetch, FormData, Headers, Request, Response

You may disable this API with the --no-experimental-fetch command-line flag.