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

Discord.js获取提及成员ID实现!info命令无响应排查

故障原因

代码无响应是逻辑判断写法错误导致的,核心问题有4个:

  • 未做消息前置校验就直接读取msg.mentions.users.first().username,消息不带@时这行直接触发异常,且没有异常捕获逻辑,代码直接静默中断。
  • Discord消息内的@用户存储格式不是纯文本@用户名,是带特殊标识的提及结构,用===做字符串全等匹配永远无法命中判断条件,命令逻辑块根本不会执行。
  • 缩略图地址取错,现有代码取的是发命令用户的头像,不是被@查询用户的头像。
  • 未过滤机器人自身发出的消息,存在触发消息循环的风险。
修复代码

原有Mongoose Schema无需修改,消息监听逻辑替换为以下内容即可:

// 按需调整引入路径
const { MessageEmbed } = require('discord.js');
const User = require('./你的User模型存储路径');

// discord.js v13及以上版本用messageCreate事件,v12及更早版本替换为message
client.on("messageCreate", async msg => {
  // 跳过所有机器人发送的消息
  if (msg.author.bot) return;
  // 校验命令前缀,不符合直接返回
  if (!msg.content.startsWith('!info ')) return;

  // 读取被@的目标用户
  const targetUser = msg.mentions.users.first();
  if (!targetUser) {
    return msg.reply("命令格式错误,请使用`!info @目标成员`格式发起查询");
  }

  try {
    const userData = await User.findOne({ userID: targetUser.id });
    if (!userData) {
      return msg.reply("该用户未完成信息注册,请先注册后再查询");
    }

    const resultEmbed = new MessageEmbed()
      .setColor('#808080')
      .setTitle('成员存档信息')
      .setDescription(`**昵称:** ${userData.nickname}\n**冒险等级:** ${userData.ar}\n**所属服务器:** ${userData.server}\n**游戏UID:** ${userData.uid}`)
      .setThumbnail(targetUser.avatarURL({ dynamic: true }))
    msg.reply({ embeds: [resultEmbed] });
  } catch (err) {
    console.error('信息查询失败:', err);
    msg.reply("查询过程出现内部错误,请稍后重试");
  }
});
注意事项
  • 确认使用的discord.js版本匹配事件名:v13+必须用messageCreate,旧版本用message,事件名写错会导致监听完全不触发。
  • 确认用户注册入库时,userID字段存储的是Discord用户的纯ID字符串,不要存带格式的提及串,否则无法匹配到数据。
  • 所有数据库异步操作必须加异常捕获,否则连接异常、查询报错时都会出现无响应、无报错的静默失败问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:06:07