Error [ERR_REQUIRE_ESM]: require() of ES Module not supported

回答 3 浏览 31.4万 2021-09-07

我想做一个Discord机器人,它只是说如果有人在游戏中在线的话。

然而,我一直收到这样的信息。

[ERR_REQUIRE_ESM]: require() of ES Module from not supported. Instead change the require of index.js in... to a dynamic import() which is available in all CommonJS modules.

这是我的代码。

    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")
            }
        }
    }

这是我的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"
    }
}
N-Man 提问于2021-09-07
我没有所有的module.exports的东西,我需要那个吗?我只是说export class什么的,这有错吗?pabrams 2021-11-25
但我认为只有在你没有将文件重命名为.mjs的情况下,才应该使用"type": "module",Sandburg 2022-07-15
3 个回答
#1楼
得票数 61

node-fetch最新版本没有使用require()语法来导入软件包。你需要到你的package.json里输入

 { 
   "type": "module",
 }

来使用import语法和导入node-fetch,但这样你就不能对任何其他包使用require。你只需要用import语句来工作。

或者你可以使用其他软件包,例如GotAxios,这些软件包可以通过require()语法导入。

Mennis 提问于2021-09-07
Peter Mortensen 修改于2022-08-19
我在我的代码中的另一个文件中使用了require(),那么它怎么会在那里起作用呢?N-Man 2021-09-07
我已经这样做了,但我还是得到了错误,因为typescript转码器把要求放回去了,在.js中。我怎样才能让它停止这样做呢?pabrams 2021-11-25
不起作用,仍然抛出错误[ERR_REQUIRE_ESM]:不支持ES模块的require()。尽管我的代码中已经没有一个require()了。FireFuro99 2021-12-17
一旦我把这个添加到我的package.json中,我还能对其他的包使用require吗?kd12345 2022-01-09
一样,这并不奏效,因为typescript转码器增加了要求。thouliha 2022-07-29
#2楼
得票数 47

我想明白了。我只是不得不把node-fetch降级到2.6.6,因为更高的版本只使用ESM,这导致了很多错误。

N-Man 提问于2021-09-07
Duc Filan 修改于2022-09-25
当我尝试这样做的时候,我从typescript得到了编译错误,比如它不能导入node-fetch,不能找到node-fetch,不能找到node-fetch的类型定义,等等等等......然后如果我添加了类型定义,它说我不需要这些......typescript和node到底是怎么了?pabrams 2021-11-25
然后,你需要像这样导入 import * as fetch from 'node-fetch';Joe Keene 2022-05-04
仍然有效。仍然很笨。Michael 2022-07-25
这太愚蠢了。 为什么不导入 require 只是不能很好地协同工作...Quinten Cabo 2022-08-18
什么是ESM?ECMAScript模块?Peter Mortensen 2022-08-19
#3楼 已采纳
得票数 33

node-fetch v3最近停止了对require导入方式的支持,转而使用ES模块。你现在需要使用ESM导入,比如。

import fetch from "node-fetch";

在你的文件的顶部。

iamkneel 提问于2021-09-07
我已经这样做了,但并没有什么帮助。pabrams 2021-11-25
为了能够导入,你需要按照这个回复中的步骤进行。stackoverflow.com/a/69089164/12152456user12152456 2021-12-09
一个有福气的答案。我抓耳挠腮了30分钟,才偶然发现这个答案,解决了我的问题。谢谢你!priyamtheone 2022-09-05
错误:"Cannot use import statement outside a module"WebDev-SysAdmin 2022-11-06
@pabrams: 这个链接对我有帮助 bobbyhadz.com/blog/…r.a.shehni 2022-11-29