Discord.js读取lastMessage.content报错求助:无法读取undefined的content属性
问题分析与修复方案
你的报错根源很清晰:Cannot read property 'content' of undefined是因为部分名为'chat'的频道还没有任何消息记录,此时c.lastMessage的值为undefined,直接访问它的.content属性自然会触发类型错误。
修复后的代码
我们需要先判断lastMessage是否存在,再检查消息内容,同时把代码拆分成更易维护的结构(避免挤在一行):
function broadcast() { // 遍历机器人加入的所有服务器 client.guilds.cache.forEach(guild => { // 筛选出所有名为'chat'的文本频道(排除语音/分类频道) const targetChannels = guild.channels.cache.filter(channel => channel.name === 'chat' && channel.type === 'GUILD_TEXT' // Discord.js v13+用这个值,v12版本替换为'text' ); targetChannels.forEach(channel => { // 先判断频道是否有历史消息,再验证消息内容 if (!channel.lastMessage || channel.lastMessage.content !== 'test') { channel.send('test') .catch(err => console.error(`发送消息失败(频道ID:${channel.id}):`, err)); // 捕获权限不足等异常 } }); }); } // 设置定时任务,注意不要过于频繁触发,避免触发Discord API速率限制 setInterval(broadcast, 3000);
额外注意事项
- 频道类型过滤:加上
channel.type判断可以避免误匹配语音频道、分类频道这类无法发送消息的频道,不同Discord.js版本的类型值略有差异,注意对应调整。 - 异常捕获:添加
.catch()能处理机器人无发送权限、频道已被删除等情况,防止单个频道的问题导致整个广播流程崩溃。 - 速率限制:Discord API对消息发送有严格的速率限制,如果机器人加入的服务器较多,3秒一次的频率可能触发限制,建议适当延长间隔时间。
内容的提问来源于stack exchange,提问作者Ege Can Karaoğlu




