Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

356
Vistas
Discord.js v13 ¿Cómo evitar que el bot se bloquee al intentar eliminar un mensaje?

Tengo este comando 'borrar' para mi bot de discordia y debería funcionar así: -el usuario escribe !mute

  1. el bot elimina esta cantidad de mensajes (hasta 100)
  2. el bot envía un mensaje diciendo que estos mensajes fueron eliminados
  3. el bot elimina ese mensaje 5 segundos después. Todo funciona, excepto la última parte. Si después de ejecutar la parte 2, otra fuente elimina el mensaje, entonces el bot no puede encontrar un mensaje para eliminar y se bloquea. El código es el siguiente:
 module.exports = { name: 'clear', description: "clears messages", async execute(message, args) { if(!args[0]) return message.reply("Please specify how many messages you want to clear!"); if(isNaN(args[0])) return message.reply("Please enter a number of messages you want to clear!"); if(args[0] > 100) return message.reply("You can't delete more than 100 messages!"); if(args[0] < 1) return message.reply("You can't delete less than 1 message!"); await message.channel.messages.fetch({limit: args[0]}).then(messages =>{ message.channel.bulkDelete(messages).then(() => { message.channel.send("Deleted " + args[0] + " messages") .then(msg => { let id = msg.id; setTimeout(function(){ if(message.channel.messages.fetch(id)) { try { msg.delete() } catch (error) { console.log(error) return } } }, 5000); }) }); }) } }

El error que estoy recibiendo es:

 C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\rest\RequestHandler.js:350 throw new DiscordAPIError(data, res.status, request); ^ DiscordAPIError: Unknown Message at RequestHandler.execute (C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\rest\RequestHandler.js:350:13) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async RequestHandler.push (C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\rest\RequestHandler.js:51:14) at async MessageManager._fetchId (C:\Users\Miki\Desktop\discord boty\jajco bot\node_modules\discord.js\src\managers\MessageManager.js:219:18) { method: 'get', path: '/channels/943105549795471443/messages/946096412922368100', code: 10008, httpStatus: 404, requestData: { json: undefined, files: [] } }

Como puede ver, he intentado usar try...catch() pero no solucionó el problema. ¿Alguna idea sobre lo que debe hacer? ¿O tal vez hay un error en mi código como una importación faltante o algo así?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

En primer lugar, echemos un vistazo a este código:

 try { msg.delete(); } catch (error) { return console.log(error); }

Este código no hará lo que esperas. msg.delete(); es una función que devuelve una Promise . Una estructura try/catch no hará nada si la promesa falla. Entonces, en cambio, para detectar el error, debe usar el método catch en Promise, tal como usó .then() anteriormente, tendrá que usar .catch() .

Así que tu nuevo código será así:

 msg.delete().catch(error => console.error(error); // Or, even better: msg.delete().catch(console.error);

Eso es exactamente lo mismo aquí:

 if (message.channel.messages.fetch(id))

Eso siempre será true porque la función fetch() devolverá una Promise y ya que no es un 0 , '' (cadena vacía), NaN , false , undefined o null . Consulte aquí los valores falsos.

En cambio, lo que está tratando de hacer es verificar si los mensajes contienen su identificación:

 message.channel.messages.fetch(id).then(msg => { // Do what you want with the fetched msg }).catch(error => { // Console error why it failed to fetch the id (probably because it doesn't exist or got deleted) message.reply('Failed to fetch the id'); });

Por último, este código también tiene algunos problemas:

 message.channel.bulkDelete(messages).then(() => {

messages es una Collection , no un número, bulkDelete() espera un número, así que haz esto:

 message.channel.bulkDelete(messages.size).then(() => {

Personalmente, no veo por qué tienes que buscar el mensaje, simplemente puedes hacer esto:

 message.channel.messages.fetch({ limit: args[0] }).then(messages => { message.channel.bulkDelete(messages.size).then(() => { message.channel.send(`Deleted ${args[0]} messages`).then(msg => { setTimeout(() => msg.delete(), 5000); }); }); });
about 4 years ago · Juan Pablo Isaza Denunciar

0

Todo lo que necesita hacer es await msg.delete() dentro de su bloque de try . Una promesa debe ser liquidada antes de que pueda ser probada por cualquier error.

 try { // Add 'await' await msg.delete(); } catch (error) { return console.log(error); }

Si desea anular el error para que la función falle en silencio:

 msg.delete() .catch(() => null);

También puede marcar Message#deletable antes de que su cliente intente eliminarlo:

 if (msg.deletable) { // I'd still recommend adding your preferred error handling msg.delete(); }
about 4 years ago · Juan Pablo Isaza Denunciar

0

return message.reply({ content: "Done" }) .then(m => setTimeout(() => message.delete().catch(() => null), 2500))

úselo así, resolverá el problema para d.js v13.6

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda