错误 [ERR_REQUIRE_ESM]:不支持 ES 模块的 require()

N-M*_*Man 251 javascript node.js node-fetch discord.js hypixel-api

我正在尝试制作一个Discord机器人,它只会显示是否有人在线玩游戏。

然而我不断收到这样的消息:

[ERR_REQUIRE_ESM]:不支持 ES 模块的 require()。相反,将index.js in... 的 require 更改为动态 import(),该动态 import() 在所有 CommonJS 模块中都可用。

这是我的代码:

    module.exports = {
        name: 'username',
        description: "this is the username command",
        async execute(message, args) {

            const fetch = require('node-fetch');

            if (args.length !== 1) {
                return message.channel.send("invalid username wtf")
            }

            const ign = args[0]

            if (ign.length > 16 || ign.length < 3) {
                return message.channel.send("invalid username wtf")
            }

            const uuid = await fetch(`https://api.mojang.com/users/profiles/minecraft/${ign}`).then(data => data.json()).then(data => data.id).catch(err => message.channel.send("error wtf"));
            const onlineInfo = await fetch(`https://api.hypixel.net/status?key=${john}&uuid=${uuid}`).then(data => data.json());

            if (uuid.length !== 32) {
                return;
            }

            if (onlineinfo.success) {
                if (onlineinfo.session.online) {
                    message.channel.send("they are online")
                }
                else {
                    message.channel.send("they are offline")
                }
            }
            else {
                message.channel.send("hypixel api bad wtf")
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的package.json文件:

{
    "name": "discordbot",
    "version": "1.0.0",
    "main": "main.js",
    "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1",
        "start": "node main.js"
    },
    "author": "",
    "license": "ISC",
    "description": "",
    "dependencies": {
        "discord.js": "^13.0.1",
        "node-fetch": "^3.0.0"
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 94

最新node-fetch版本不使用require()语法来导入包。您需要转到您的package.json并输入

 { 
   "type": "module",
 }
Run Code Online (Sandbox Code Playgroud)

使用import语法和 import node-fetch,但是您不能用于require任何其他包。您只需要使用import语句即可。

或者您可以使用其他包,例如GotAxios,可以通过require()语法导入。

  • 我已经这样做了,但仍然收到错误,因为打字稿转译器将需求放回到 .js 中。我怎样才能让它停止这样做? (48认同)
  • 不起作用,仍然抛出错误 [ERR_REQUIRE_ESM]:不支持 ES 模块的 require() 。尽管我的代码中不再有一个 require() 。 (21认同)
  • 同样,这不起作用,因为打字稿转译器添加了要求。 (10认同)
  • 我在代码的另一个文件中使用 require() ,那么它为什么在那里工作呢? (9认同)
  • `got` v12 不能与 `require()` 一起使用,你必须使用 `import`。“这个包是原生 ESM,不再提供 CommonJS 导出。如果您的项目使用 CommonJS,则必须转换为 ESM 或使用动态 import() 函数。” (4认同)
  • “type {type: module}”是什么意思,我们应该在 package.json 的哪个位置执行此操作? (2认同)

N-M*_*Man 79

我想到了。我只好降级node-fetch到2.6.6,因为更高版本只使用ESM,这导致了很多错误。

  • 这太愚蠢了。为什么不导入一个需求,只是不能很好地协同工作...... (44认同)
  • 当我尝试这样做时,我从打字稿中得到编译时错误,比如它无法导入节点获取,无法找到节点获取,无法找到节点获取的类型定义,等等等等...然后如果我添加类型定义,它会说我不需要那些...wtf 一直都在使用打字稿和节点 (5认同)
  • 仍然有效。还是傻。 (2认同)

iam*_*eel 40

node-fetchv3 最近停止支持require导入方式,转而支持 ES 模块。您现在需要使用 ESM 导入,例如:

import fetch from "node-fetch";
Run Code Online (Sandbox Code Playgroud)

在你的文件的顶部。

  • 我已经这样做了,但没有帮助。 (99认同)
  • 所有包依赖项都需要使用与正在运行的应用程序相同的模块导入类型,这绝对是荒谬的。Node.js 开发人员如何认为在一切都依赖于一切的生态系统中打破向后兼容性会很好地工作,这超出了我的想象。 (30认同)
  • 错误:“无法在模块外部使用 import 语句” (6认同)
  • 为了能够导入它,您需要按照此回复中的步骤操作:/sf/answers/4836241511/ (2认同)
  • @pabrams:此链接帮助我 https://bobbyhadz.com/blog/javascript-error-err-require-esm-of-es-module-node-fetch (2认同)