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

Discord.js snipe指令无法正常执行问题排查,附对应实现代码片段

问题根因
  • 核心逻辑错误:代码中snipe指令的触发条件写反,if (!message.content.startsWith(${prefix}snipe))的判定逻辑为消息内容不以snipe指令开头时,才执行后续的snipe功能代码,直接导致用户发送snipe指令时不会触发对应逻辑。
  • 版本兼容问题:如果你使用的是Discord.js v13及以上版本,还存在两个API不兼容问题:
    • 旧版message事件已被废弃,新版接收普通消息的事件名为messageCreate
    • 成员权限校验方法hasPermission已被移除,新版对应方法为message.member.permissions.has()
  • 前置逻辑缺失:代码中没有初始化client.snipes集合、也没有监听messageDelete事件存储被撤回的消息,就算触发指令也无法获取到撤回的消息数据。
修复步骤
  1. 先补充前置的初始化和撤回消息存储逻辑,在客户端初始化后添加如下代码:
// 初始化存储撤回消息的Map集合
client.snipes = new Map();
// 监听消息撤回事件,存储被撤回的消息
client.on('messageDelete', message => {
  // 如需过滤机器人发送的消息可以添加判断:if (message.author.bot) return;
  client.snipes.set(message.channel.id, {
    content: message.content,
    author: message.author,
    image: message.attachments.first()?.proxyURL ?? null
  });
});
  1. 修正snipe指令的逻辑错误和版本兼容问题,修复后的指令代码如下:
// 注意:Discord.js v12及以下版本事件名仍使用message
client.on("messageCreate", (message) => {
  // 过滤机器人消息和不带前缀的消息
  if (message.author.bot || !message.content.startsWith(prefix)) return;
  let args = message.content.substring(prefix.length).split(" ");
  // 匹配snipe指令,删除原代码错误添加的取反符号
  if (args[0] === 'snipe') {
    // 权限校验:Discord.js v12及以下版本改为 message.member.hasPermission("MANAGE_MESSAGES")
    if (!message.member.permissions.has("MANAGE_MESSAGES")) return message.channel.send(`you cant snipe`);
    const msg = client.snipes.get(message.channel.id);
    if (!msg) return message.channel.send(`nothing to snipe :(`);
    const SnipeEmbed = new Discord.MessageEmbed()
      .setAuthor(msg.author.tag, msg.author.displayAvatarURL())
      .setDescription(msg.content)
      .setColor("RED")
      .setImage(msg.image);
    // 注意:Discord.js v13及以上版本发送嵌入必须放在embeds数组中
    message.channel.send({ embeds: [SnipeEmbed] });
  }
});

内容的提问来源于stack exchange,提问作者Jdizzle_AC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:15:02