discord.js判断消息作者ID是否等于机器人ID及报错解决
问题背景
使用discord.js开发机器人时,尝试校验指定消息ID对应的消息是否为自身发送,原代码运行后抛出如下错误:
TypeError: msgID.includes is not a function at Object.exports.callback (/home/runner/J-Bot/Commands/edit.js:30:17)
报错产生原因
- 类型调用错误:
message.channel.messages.fetch()执行成功时返回Message类型的实例对象,执行失败被catch捕获时返回值是undefined,这两种类型都没有字符串/数组原型上的includes()方法,直接调用必然触发上述类型错误。 - 执行顺序错误:原代码将
includes()判断放在了undefined校验逻辑之前,哪怕includes()方法存在,fetch失败返回undefined时也会先触发方法不存在的报错,根本走不到后续的消息ID无效判断分支。 - 判断逻辑错误:校验消息是否为机器人自身发送,不需要做字符串包含匹配,直接读取消息实例上的作者ID字段和机器人ID做全等比对即可;且原代码的判断分支逻辑写反——如果内容包含机器人ID就判定不属于机器人,和预期逻辑完全相悖。
修复后的正确实现
// 无需硬编码机器人ID,直接通过client.user.id获取当前机器人ID兼容性更好 const targetMsg = await message.channel.messages.fetch(args[0]).catch(() => undefined); // 第一步:先校验消息是否拉取成功 if (targetMsg === undefined) { return message.reply('Wrong Message ID!'); } // 第二步:校验消息作者是否为机器人自身 if (targetMsg.author.id !== client.user.id) { return message.reply(`This message does not belong to <@${client.user.id}>`); } // 校验通过后执行编辑、删除触发指令的操作,新增错误捕获处理权限不足、消息超期等异常场景 await targetMsg.edit(args[1]) .then(() => message.delete()) .catch(err => { console.error('编辑消息失败:', err); message.reply('消息编辑失败,请确认我有权限编辑该条消息且消息发送时间未超过14天'); });
关键注意点
- 执行顺序规范:所有异步拉取的资源,必须先做存在性校验,再执行后续属性读取、方法调用操作,避免访问undefined上的属性/方法触发报错。
- 字段使用规范:discord.js的Message实例上,发送者ID固定存储在
author.id字段,直接做字符串全等比对即可,不需要做模糊的字符串包含匹配,避免误判。 - 编码习惯建议:尽量避免硬编码固定ID,动态读取
client.user.id可以避免机器人迁移、应用ID变更时需要手动修改常量的问题。
内容的提问来源于stack exchange,提问作者Julian-V
相关产品推荐
相关产品推荐

