Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

350
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda