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

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,会触发新的类型错误。
修复方案
  1. 修正初始化语句的拼写和变量命名,通用小写client作为Discord客户端实例的变量名,修正后初始化代码为:
const client = new Discord.Client();
  1. 调整指令匹配规则对齐!hello的需求,补充空值判断、异常捕获逻辑,去掉冗余的用户查询步骤。
  2. 修复后的完整功能代码如下:
// 提前定义好指令前缀,例: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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:09:29