discord.js技术问题:删除编辑后消息失败及报错排查求助
Discord机器人编辑并删除提示消息时出现TypeError: msg.delete is not a function错误
我正在开发一个可以发送随机GIF的Discord机器人,因为GIF加载耗时较长,我想先给用户发送提示消息,1秒后编辑这条消息,最后再删除它。我写的代码如下:
if (message.content === 'zhood'){ message.channel.send("*Gifs take long to load, please wait*") .then((msg) => setTimeout(function(){ msg.edit('*Collecting random GIFs*'); }, 1000)) .then(msg =>{ msg.delete({ timeout: 2000 }) }) }
运行后出现了这个错误:
(node:12248) UnhandledPromiseRejectionWarning: TypeError: msg.delete is not a function
我也试过用message.delete({timeout:2000}),但问题还是存在,希望有人能帮我解决这个问题。
问题原因分析
你碰到的这个错误其实是Promise链的返回值搞混了。你看,第一个.then()里你返回的是setTimeout()的结果——这东西是个定时器ID,根本不是Discord的Message对象!所以第二个.then()里的msg自然就没有delete()方法啦。
解决方案
给你两种靠谱的修复方式:
方法一:把编辑和删除逻辑放在同一个then里
这样我们就能一直拿着最初的Message对象操作,不会搞混:
if (message.content === 'zhood'){ message.channel.send("*Gifs take long to load, please wait*") .then((msg) => { // 先等1秒再编辑消息 setTimeout(() => { // 编辑完消息后,直接链式调用delete,2秒后删掉 msg.edit('*Collecting random GIFs*') .then(editedMsg => editedMsg.delete({ timeout: 2000 })); }, 1000); }) }
方法二:用async/await让代码更清爽
如果你的Node.js版本支持ES8+,用async/await写异步逻辑会直观很多,不容易出错:
if (message.content === 'zhood'){ // 用自执行async函数包裹逻辑 (async () => { // 先发送初始提示消息,拿到消息对象 const msg = await message.channel.send("*Gifs take long to load, please wait*"); // 等1秒 await new Promise(resolve => setTimeout(resolve, 1000)); // 编辑消息,拿到编辑后的消息对象 const editedMsg = await msg.edit('*Collecting random GIFs*'); // 再等2秒删掉这条编辑后的消息 await editedMsg.delete({ timeout: 2000 }); })(); }
小提醒
msg.edit()本身会返回一个Promise,结果是编辑后的Message对象,所以我们可以直接链式调用.delete(),或者用await获取它来操作。- 你之前试的
message.delete()是删用户发的那条"zhood"消息,不是机器人发的提示消息,当然解决不了问题啦~
内容的提问来源于stack exchange,提问作者user14023978




