javascript - 错误 : require() of ES modules is not supported when importing node-fetch

标签 javascript node.js node-fetch

我正在创建一个程序来分析安全摄像头流并卡在第一行。目前我的 .js 文件只有 node-fetch 的导入,它给了我一条错误消息。我究竟做错了什么?
在适用于 Linux 的 Windows 子系统中运行 Ubuntu 20.04.2 LTS。
Node 版本:

user@MYLLYTIN:~/CAMSERVER$ node -v
v14.17.6
Node 获取包版本:
user@MYLLYTIN:~/CAMSERVER$ npm v node-fetch

node-fetch@3.0.0 | MIT | deps: 2 | versions: 63
A light-weight module that brings Fetch API to node.js
https://github.com/node-fetch/node-fetch

keywords: fetch, http, promise, request, curl, wget, xhr, whatwg

dist
.tarball: https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0.tgz
.shasum: 79da7146a520036f2c5f644e4a26095f17e411ea
.integrity: sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q==
.unpackedSize: 75.9 kB

dependencies:
data-uri-to-buffer: ^3.0.1 fetch-blob: ^3.1.2         

maintainers:
- endless <jimmy@warting.se>
- bitinn <bitinn@gmail.com>
- timothygu <timothygu99@gmail.com>
- akepinski <npm@kepinski.ch>

dist-tags:
latest: 3.0.0        next: 3.0.0-beta.10  

published 3 days ago by endless <jimmy@warting.se>
esm 包版本:
user@MYLLYTIN:~/CAMSERVER$ npm v esm

esm@3.2.25 | MIT | deps: none | versions: 140
Tomorrow's ECMAScript modules today!
https://github.com/standard-things/esm#readme

keywords: commonjs, ecmascript, export, import, modules, node, require

dist
.tarball: https://registry.npmjs.org/esm/-/esm-3.2.25.tgz
.shasum: 342c18c29d56157688ba5ce31f8431fbb795cc10
.integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
.unpackedSize: 308.6 kB

maintainers:
- jdalton <john.david.dalton@gmail.com>

dist-tags:
latest: 3.2.25  

published over a year ago by jdalton <john.david.dalton@gmail.com>
.js 文件的内容(实际上只是导入):
user@MYLLYTIN:~/CAMSERVER$ cat server.js 
import fetch from "node-fetch";
结果:
user@MYLLYTIN:~/CAMSERVER$ node -r esm server.js 
/home/user/CAMSERVER/node_modules/node-fetch/src/index.js:1
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /home/user/CAMSERVER/node_modules/node-fetch/src/index.js
require() of ES modules is not supported.
require() of /home/user/CAMSERVER/node_modules/node-fetch/src/index.js from /home/user/CAMSERVER/server.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /home/user/CAMSERVER/node_modules/node-fetch/package.json.

    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1089:13) {
  code: 'ERR_REQUIRE_ESM'
}
user@MYLLYTIN:~/CAMSERVER$ 

最佳答案

来自 Upgrade Guide

node-fetch was converted to be a ESM only package in version 3.0.0-beta.10. node-fetch is an ESM-only module - you are not able to import it with require.

Alternatively, you can use the async import() function from CommonJS to load node-fetch asynchronously:

// mod.cjs
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));
或者你留在 v2 正如他们在 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.


编辑

I saw that in the doc, used it, and the script crashes with :

error TS2556: A spread argument must either have a tuple type or be passed to a rest parameter.


由于您使用的是 typescript ,因此您应该执行以下操作
import { RequestInfo, RequestInit } from "node-fetch";

const fetch = (url: RequestInfo, init?: RequestInit) =>  import("node-fetch").then(({ default: fetch }) => fetch(url, init));

关于javascript - 错误 : require() of ES modules is not supported when importing node-fetch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69041454/

相关文章:

node.js - node-fetch:为什么推荐使用 `signal` 而不是 `timeout` ?

javascript - 自动拖动 ".draggable"元素

node.js - fatal error : Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory when running a react app

Javascript - 需要策略模式建议

node.js - Sequelize - 嵌套关联查询只检索 1 个数组数据?

node.js - 为什么这个 if/else 在 ejs 中不起作用?

javascript - 模拟 Node 获取时出现“已使用的主体”错误?

javascript - TypeError : data. map 不是函数

javascript - Node.js 捕获闭包变量

javascript - 以同样的形式上传图片和文字