如何将机器人发送的消息存为变量后续删除,解决delete不是函数报错
错误根因
message.channel.send() 是异步API,执行后返回的是 Promise<Message> 类型对象,而非直接的已发送消息实例。你直接对 Promise 对象调用不存在的 delete() 方法,就会触发该类型错误。
解决方案
方案1:async/await 写法(推荐)
首先给你当前的消息事件外层回调函数加上 async 修饰,再用 await 等待消息发送完成,拿到实例后再执行删除操作:
// 示例:消息事件回调加async修饰 client.on('messageCreate', async message => { // 其他逻辑... const qsend = await message.channel.send("Choose a page to go to."); // 此处插入你监听用户回复的逻辑 // 接收到用户有效回复后执行删除 qsend.delete(); })
方案2:.then() 链式回调写法
如果你不想修改外层函数的 async 声明,也可以通过 Promise 的 then 回调拿到已发送的消息实例存储,后续再调用删除:
let sentPrompt; message.channel.send("Choose a page to go to.") .then(sentMsg => { sentPrompt = sentMsg; }) // 接收到用户回复后执行删除 if (sentPrompt) sentPrompt.delete();
额外注意
delete()本身也是异步方法,如果需要等待删除完成再执行后续逻辑,可以给它也加上await修饰- 需确保机器人拥有对应频道的「删除消息」权限,否则就算语法正确也会抛出权限错误
- 删除操作要放在用户回复的监听逻辑内部,不要紧跟在 send 之后执行,避免提示刚发送就被删除,用户无法看到内容
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

