【发布时间】:2021-11-01 14:10:23
【问题描述】:
我正在创建一个程序来分析安全摄像头流并卡在第一行。目前我的 .js 文件只有 node-fetch 的导入,它给了我一条错误消息。我做错了什么?
在适用于 Linux 的 Windows 子系统中运行 Ubuntu 20.04.2 LTS。
节点版本:
user@MYLLYTIN:~/CAMSERVER$ node -v
v14.17.6
node-fetch 包版本:
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$
【问题讨论】:
-
它们是 nodejs 的两种模块语法。 commonJS 语法,使用
require和module.exports,以及 ES 语法,使用import * from "path"模块样式。默认情况下,nodejs 将尝试使用 CommonJS 语法加载模块。如果要使用ES语法,则必须在 package.json 中指定"type":"module"。但是你不能把它们混在一起。您可以使用一种语法,但不能同时使用两种语法。 -
@Ariart 我在我的代码中使用 ES 语法,并且 node-fetch 确实有 "type": module in it's package.json
-
是否在你的项目package.json中指定?
-
@Ariart 我什至没有 package.json,创建了一个只包含 "type": "module" 的 package.json 并且有效!谢谢!有没有办法在运行节点时设置这个内联而不是在 package.json 中定义它?
-
是的,您可以运行带有标志的节点。根据记忆,它类似于
--input-type=module
标签: javascript node.js node-fetch