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
相关产品推荐
相关产品推荐

