discord.js开发purge指令 如何插入message.delete实现消息自动删除
问题原因与解决方案
错误点说明
- 第一种写法重复发消息的核心原因是你先后两次调用了
message.channel.send(purgeEmbed):第一次在bulkDelete的then回调中,第二次在try块结束后的单独代码行,因此会出现两条重复embed,只有第二次发送的实例调用了删除方法,所以仅一条被删除。 - 第二种写法失效有两个问题:一是
then需要传入回调函数,你直接执行message.delete()属于同步立即调用,并没有拿到发送消息返回的实例;二是语法缺少闭合的括号和回调函数包裹,代码本身存在语法错误。
正确实现代码
写法1:async/await写法(更易读,推荐新手使用)
try { // 先执行批量删除 await message.channel.bulkDelete(fetched); // 发送通知embed,拿到返回的消息实例 const purgeMsg = await message.channel.send(purgeEmbed); // 2秒后删除该通知 purgeMsg.delete({ timeout: 2000 }); } catch (err) { console.log(err); // 错误通知也可以按需加自动删除 const errMsg = await message.channel.send(issuePurgeEmbed); errMsg.delete({ timeout: 3000 }); }
写法2:链式调用写法
try { await message.channel.bulkDelete(fetched) // send返回消息实例,传给下一个then .then(() => message.channel.send(purgeEmbed)) // 用回调拿到消息实例后调用delete .then(purgeMsg => purgeMsg.delete({ timeout: 2000 })) } catch (err) { console.log(err); message.channel.send(issuePurgeEmbed); }
ms插件使用方案
先执行安装命令:npm i ms
在代码顶部导入ms:
const ms = require('ms');
之后删除的超时参数可以直接用语义化的时间写法,不用手动换算毫秒:
purgeMsg.delete({ timeout: ms('2s') }); // 也支持其他单位,比如ms('1m')就是1分钟,ms('5s')就是5秒,可读性更高
内容的提问来源于stack exchange,提问作者Hanako
相关产品推荐
相关产品推荐

