Discord Bot向被@用户发DM报client未定义错误如何解决
错误原因
抛出ReferenceError: client is not defined是两个基础语法问题导致的,同时你的代码还存在逻辑不匹配、边界缺失的问题:
- JavaScript对大小写敏感,你初始化客户端实例时定义的变量名是大写开头的
Client,后续业务逻辑里调用的是小写开头的client,二者是完全独立的标识符,解释器找不到对应定义自然报错。 - 初始化语句存在拼写错误:
new Disocrd.Client()里的Disocrd是错写,正确命名空间为Discord,这行本身就会先触发引用错误。 - 指令匹配规则和需求不符:你预期的触发指令是
!hello @用户,但判断条件写的是prefix + "sendHello",就算变量问题修复,输入目标指令也不会触发执行逻辑。 - 冗余逻辑+缺少边界判断:
message.mentions.users.first()返回的本身就是可直接调用方法的User对象,不需要再通过client.users.cache.get重复查询;同时没有做「消息内未@任何用户」的场景判断,这种情况下taggedUser值为undefined,会触发新的类型错误。
修复方案
- 修正初始化语句的拼写和变量命名,通用小写
client作为Discord客户端实例的变量名,修正后初始化代码为:
const client = new Discord.Client();
- 调整指令匹配规则对齐
!hello的需求,补充空值判断、异常捕获逻辑,去掉冗余的用户查询步骤。 - 修复后的完整功能代码如下:
// 提前定义好指令前缀,例:const prefix = '!' if (message.content.startsWith(prefix + "hello")) { const taggedUser = message.mentions.users.first(); // 未@用户时直接返回提示,终止执行 if (!taggedUser) return message.reply("请先@你要发送私信的目标用户"); // 直接调用被@用户的send方法发私信 taggedUser.send("hello") .catch(err => { // 捕获私信发送失败的场景,比如用户关闭陌生人私信、机器人权限不足 console.error("私信发送失败:", err); message.reply("私信发送失败,对方可能关闭了服务器成员私信权限"); }) }
补充说明:机器人需要和被@用户处于同一个共同服务器,且拥有对应服务器的基础消息权限,才能成功投递私信;如果用户设置了拒绝非好友私信,也会导致发送失败。
内容的提问来源于stack exchange,提问作者Tomáš T.
相关产品推荐
相关产品推荐

