Soy nuevo en node.js y la programación asíncrona, así que estoy un poco confundido sobre por qué sucede esto. Estoy tratando de ejecutar un bot de discordia que me dará datos de un sitio web de terceros. Puedo consultar los datos del sitio de terceros y puedo ver los datos en mi consola. Sin embargo, los datos no pueden aparecer en discordia.
const { SlashCommandBuilder } = require('@discordjs/builders'); const execFile = require('child_process').execFile; const path = require('node:path'); const commandsPath = path.join(__dirname, '..', 'Folder_name'); let scriptPath = path.join(commandsPath, 'querydata.js'); let output = ""; module.exports = { data: new SlashCommandBuilder() .setName('cmdname') .setDescription('blank'), async execute(interaction) { await runScript(scriptPath) await interaction.reply(output) }, }; function runScript(scriptPath) { return new Promise((resolve, reject) => { execFile('node', [scriptPath], (error, stdout, stderr) => { if (error) { console.error('stderr', stderr); throw error; } console.log(stdout); output = stdout resolve(output) }); }); }Intenté usar Promise, async/await pero vería este error
RangeError [MESSAGE_CONTENT_TYPE]: Message content must be a non-empty string.Al cambiar mi código al código a continuación, obtendría este error, en el que puedo consultar los datos, pero cuando obtuve los datos, la discordia terminaría la llamada, pensando que mi bot no respondió. (El bot está en línea cuando probé esto) ingrese la descripción de la imagen aquí
module.exports = { data: new SlashCommandBuilder() .setName('cmd') .setDescription('blank'), async execute(interaction) { runScript(scriptPath) .then(interaction.reply(output)) }, }; function runScript(scriptPath) { return new Promise((resolve, reject) => { execFile('node', [scriptPath], (error, stdout, stderr) => { if (error) { console.error('stderr', stderr); throw error; } console.log(stdout); output = stdout resolve(output) }); }); }No lo entiendo, pensé que si usaba await entonces el script esperaría hasta que la función runScript finalice antes de responder a discord. Pero el script sigue intentando enviar la cadena de salida vacía a discordia, lo que provoca el error RangeError. Por otro lado, cuando uso el segundo bloque de código, aparece el error en Discord (el error que se ve en la imagen).
¡Esto debería funcionar para ti!
async execute(interaction) { await runScript(scriptPath) .then(output => interaction.reply(output)) } await el script, lo que literalmente significa esperar a que termine sus promesas, luego tomará el resultado y responderá con él.