You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:57:22