Estoy trabajando en un bot. Hice un comando de asado. Recibo este error.
internal/modules/cjs/loader.js:1089 throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath); ^ Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: C:\Users\acer\Documents\test\node_modules\node-fetch\src\index.js require() of ES modules is not supported. require() of C:\Users\acer\Documents\test\node_modules\node-fetch\src\index.js from C:\Users\acer\Documents\test\commands\roast.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 C:\Users\acer\Documents\test\node_modules\node-fetch\package.json. ←[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1089:13)←[39m ←[90m at Module.load (internal/modules/cjs/loader.js:937:32)←[39m ←[90m at Function.Module._load (internal/modules/cjs/loader.js:778:12)←[39m ←[90m at Module.require (internal/modules/cjs/loader.js:961:19)←[39m ←[90m at require (internal/modules/cjs/helpers.js:92:18)←[39m at Object.<anonymous> (C:\Users\acer\Documents\test\commands\roast.js:3:15) ←[90m at Module._compile (internal/modules/cjs/loader.js:1072:14)←[39m ←[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)←[39m ←[90m at Module.load (internal/modules/cjs/loader.js:937:32)←[39m ←[90m at Function.Module._load (internal/modules/cjs/loader.js:778:12)←[39m { code: ←[32m'ERR_REQUIRE_ESM'←[39meste es mi asado.js
const random = require("something-random-on-discord").Random const oneLinerJoke = require('one-liner-joke'); const fetch = require('node-fetch') const Discord = require('discord.js') module.exports = { name : 'roast', description : 'roasts a user', async execute(message, args){ if (!args[0]) return message.channel.send('Invalid Format') const mentionedMember = message.guild.mentions.member.first(); if (!mentionedMember) return message.channel.send('User not found') let msg = await message.channel.send('Setting a roast...') fetch('http://evilinsult.com/generate_insult.php?lang=en&type=json') .then(res => res.json()) .then(json => { message.channel.send(json.insult) }); } }este es mi main.js
// Import the discord.js module const Discord = require('discord.js'); const fs = require('fs'); // Create an instance of a Discord client const client = new Discord.Client(); client.commands = new Discord.Collection(); const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js')); const prefix = "$" /** * The ready event is vital, it means that only _after_ this will your bot start reacting to information * received from Discord */ client.on('ready', () => { console.log('I am ready!'); }); client.on('message', message => { if (!message.content.startsWith(prefix) || message.author.bot) return; const args = message.content.slice(prefix.length).trim().split(/ +/); const command = args.shift().toLowerCase(); if(command === 'pingg'){ client.commands.get('pingg').execute(message, args); } if(command === 'roast'){ client.commands.get('roast').execute(message, args); } if (!client.commands.has(command)) return; try { client.commands.get(command).execute(message, args); } catch (error) { console.error(error); message.reply('there was an error trying to execute that command!'); } }); commandFiles.forEach(file => { const command = file.split(/.js$/)[0]; client.commands.set(command, require(`./commands/${file}`)); }); client.login('censored');como dice el error:
package.json contains "type": "module" which defines all .js files in that package scope as ES modulesnormalmente tienes 3 opciones:
en su caso particular, está utilizando node-fetch, que ahora es solo esmodule (desde la versión 3). entonces la única solución disponible para usted es usar la importación en todas partes.
require debería convertirse en algo como esto:
import {Random} from 'something-random-on-discord'; import oneLinerJoke from 'one-liner-joke'; import fetch from 'node-fetch'; import Discord from 'discord.js';EDITAR: también puede eliminar la búsqueda de nodos o volver a branch v2 para seguir usando require.
Como se menciona en README.md también... Otra forma de hacer que fetch@3 suceda es importar node-fetch usando la import() admitida en el nodo v12.20
const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));esto también funciona desde commonjs (la siguiente solicitud no volverá a importar nodo-fetch porque los módulos se almacenan en caché) Esto puede hacer que el proceso de nodo se inicie más rápido y solo carga de forma diferida la búsqueda de nodo cuando es necesario
aquí hay otra forma de precargarlo:
const fetchP = import('node-fetch').then(mod => mod.default) const fetch = (...args) => fetchP.then(fn => fn(...args))No es necesario que convierta su proyecto completo a ESM solo porque lo hicimos. También puede quedarse con la rama v2; seguiremos actualizando v2 con errores/problemas de seguridad. Pero no tanto con las nuevas funciones...
(Todavía recomiendo a otros que cambien a ESM doe)
Para los usuarios de TypeScript que solo buscan los Tipos, puede hacer: import type { Request } from 'node-fetch' (esto no importará ni transpilará nada; esta anotación de escritura simplemente se descartará)
Hay una sección completa sobre cómo importar/requerir búsqueda de nodos en proyectos cjs en el n.º 1279