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

Discord.js TypeError:无法读取undefined的'id'属性求助

解决Discord.js中TypeError: Cannot read property 'id' of undefined的问题

1. 事件参数错误(最可能的根因)

你在guildBanAdd事件监听里把参数命名为user,但Discord.js的这个事件触发时传入的是GuildBan对象,不是单纯的User对象。User本身没有guild属性,所以user.guild会返回undefined,自然就无法读取它的id属性了。

修正事件监听的参数逻辑:

client.on('guildBanAdd', guildBan => { // 将参数名改为guildBan,明确它的类型
  const targetUser = guildBan.user; // 这里才是被封禁的用户对象
  const targetGuild = guildBan.guild; // 这里是封禁发生的服务器对象
  
  // 后续用targetGuild.id替代原来的user.guild.id
  if (serversInfo[targetGuild.id].modlog_enabled == true && serversInfo[targetGuild.id].modlog_channel !== null) {
    var d = Date.now() 
    d = new Date(d) 
    d = d.getMonth() + 1 + '/' + d.getDate() + '/' + d.getFullYear() + ' ' + (d.getHours() > 12 ? d.getHours() - 12 : d.getHours()) + ':' + d.getMinutes();
    // 你的其他逻辑代码...
  }
});

2. 服务器配置未初始化

即使参数问题解决了,如果servers.json里没有当前服务器的配置条目,serversInfo[targetGuild.id]会是undefined,之后访问它的modlog_enabled也会触发类似的错误。

建议在使用配置前先检查并初始化:

const guildId = targetGuild.id;
// 检查当前服务器是否有配置,没有则初始化默认值
if (!serversInfo[guildId]) {
  serversInfo[guildId] = {
    modlog_enabled: false,
    modlog_channel: null
    // 可以添加其他你需要的默认配置项
  };
  // 把初始化后的配置写回文件,避免重启后丢失
  fs.writeFileSync('./data/servers.json', JSON.stringify(serversInfo, null, 2));
}

// 现在再访问配置就不会报错了
if (serversInfo[guildId].modlog_enabled && serversInfo[guildId].modlog_channel) {
  // 你的逻辑代码...
}

额外优化建议

  • 可以使用可选链操作符(?.)简化空值检查,比如serversInfo[guildId]?.modlog_enabled,这样如果配置不存在,表达式会返回undefined而直接跳过判断,不会抛出错误。
  • 读取JSON文件时加上错误处理,防止文件不存在或格式错误导致崩溃:
let serversInfo = {};
try {
  serversInfo = JSON.parse(fs.readFileSync('./data/servers.json', 'utf8'));
} catch (err) {
  console.error('读取服务器配置文件失败:', err);
  // 初始化空配置对象
  serversInfo = {};
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:44:45