Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I'm trying to make a Discord bot that just says if someone is online on the game.

However I keep getting this message:

[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.

This is my code:

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

This is my package.json file:

{
    "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"
    }
}
like image 355
N-Man Avatar asked Sep 07 '21 00:09

N-Man


People also ask

How do I enable ES modules in node JS?

To be able to load an ES module, we need to set “type”: “module” in this file or, as an alternative, we can use the . mjs file extension as against the usual . js file extension. Also, from Node version 12.7.

Can I use both require and import?

Cases where it is necessary to use both “require” and “import” in a single file, are quite rare and it is generally not recommended and considered not a good practice. However, sometimes it is the easiest way for us to solve a problem. There are always trade-offs and the decision is up to you.

How add require in JavaScript?

To include the Require. js file, you need to add the script tag in the html file. Within the script tag, add the data-main attribute to load the module. This can be taken as the main entry point to your application.

What are ES modules?

Import modules using 'import' keyword - in Node, Deno or the browser. Cheatsheets / JavaScript / General / Modules / ES Modules. As of ES6 (ES2015), JavaScript supports a native module format called ES Modules, or ECMAScript Modules. This is modern way to do modules in JavaScript.

Is require() of ES modules is not supported?

It'll be solved for you. the error Require () of ES modules is not supported occurs because you installed node-fetch version 3 and you can downgrade and install version 2. Your issue will be solved.

Why is [err_require_ESM] require() not supported?

The got error " [ERR_REQUIRE_ESM]: require () not supported" occurs because the got package has been converted to be an ESM only package in version 12 , which means that the package cannot be imported with require () anymore.

How to import an ESM module into a commonjs module?

In a very recent version of nodejs, you can dynamically import an ESM module into a CommonJS module using let fetch = await import ('node-fetch'). Show activity on this post. Thanks for contributing an answer to Stack Overflow!

Is it possible to convert require() to ESM?

If your environment supports ES Modules, you should try to convert the require () import to ESM. But this might not work, depending on your setup. Note that if you use TypeScript with version less than 4.6, you should be staying on got version 11.8.3. You can read more about this in this GitHub issue.


Video Answer


3 Answers

The node-fetch latest version doesn't use the require() syntax to import the package. You need to go to your package.json and type

 { 
   "type": "module",
 }

to use the import syntax and import node-fetch, but then you can't use require for any other packages. You need to work with import statement only.

Or you can use other packages, such as Got or Axios, which can be imported by the require() syntax.

like image 134
Glitter Avatar answered Oct 16 '22 18:10

Glitter


node-fetch v3 recently stopped support for the require way of importing it in favor of ES Modules. You'll need to use ESM imports now, like:

import fetch from "node-fetch";

at the top of your file.

like image 28
iamkneel Avatar answered Sep 21 '22 14:09

iamkneel


I figured it out. I just had to downgrade node-fetch to 2.6.6, as the higher versions only use ESM, which caused a lot of errors.

like image 40
N-Man Avatar answered Oct 16 '22 20:10

N-Man