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

运行基于mysql2的Discord机器人时出现Cannot read property 'id' of null报错

问题根因

报错的本质是client.users.resolve() 方法在无法通过ID匹配到对应Discord用户时会返回null,你代码中直接访问affModo.id和affMembre.id时没有提前校验变量是否为非空值,当数据库存储的管理员/成员ID对应的用户已退服、ID无效、或不在机器人本地缓存中时,就会触发空指针报错。

两个环境运行表现不一致的原因通常是缓存差异:树莓派上运行的机器人已经缓存了所有日志涉及的用户ID,而VPS上新部署的机器人未拉取全量用户缓存,或是两个环境运行的机器人接入的不是同一台Discord服务器,部分ID仅在原环境的服务器中存在。

解决方案

1. 修复空指针判断逻辑

把代码中三处出现的判断语句:

if(affModo.id && affMembre.id){
    message.channel.send('**['+affType+' - <@'+affModo.id+'>]** '+affTime+', <@'+affMembre.id+'> : '+e.motif);
}

统一替换为以下逻辑,先校验用户对象是否存在,同时加兜底显示逻辑,避免找不到用户时直接丢弃整条日志:

if(affModo && affMembre){
    message.channel.send(`**[${affType} - <@${affModo.id}>]** ${affTime}, <@${affMembre.id}> : ${e.motif}`);
}else{
    // 找不到用户时直接展示ID兜底
    const modoName = affModo ? `<@${affModo.id}>` : `用户ID:${e.modo}(已失效)`;
    const membreName = affMembre ? `<@${affMembre.id}>` : `用户ID:${e.membre}(已失效)`;
    message.channel.send(`**[${affType} - ${modoName}]** ${affTime}, ${membreName} : ${e.motif}`);
}

2. 可选优化

  • 你的代码中三次数据库查询的结果处理逻辑完全重复,可以抽成公共函数,减少冗余代码,后续修改只需调整一次。
  • 代码开头引入了moment库但完全没有使用,用来做日期格式化会比手动补0拼接更简洁,比如替换你原有的日期拼接逻辑为:
    const affTime = moment(e.date * 1000).format('DD/MM/YYYY HH:mm:ss')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:45:09