在discord.js中通过命令获取服务器与频道ID及lowdb报错排查
问题排查与修复方案
嘿,我来帮你理清楚这个问题的根源和解决办法:
1. 为什么会出现Cannot read property 'get' of undefined?
这个错误的核心原因是你导入的client对象并没有正确初始化Discord客户端实例——要么是你的my_bot.js没有导出一个已创建的客户端,要么是导出的对象根本不是Discord.Client的实例,导致client.guilds变成了undefined。
另外,就算client.guilds能正常使用,你当前获取服务器和频道ID的逻辑也完全没必要,甚至有错误:
client.guilds.get(message.guild.id).id:message.guild.id本身就是服务器ID,完全不需要再通过客户端去查一遍服务器集合client.guilds.get(message.channel.id):这是逻辑错误,client.guilds是服务器的集合,用频道ID去查服务器肯定找不到结果
2. 分步修复步骤
第一步:确保my_bot.js正确导出客户端
打开你的my_bot.js文件,确认里面有创建客户端并导出的代码(以Discord.js v12为例,v13+版本写法类似):
const Discord = require('discord.js'); // 创建客户端实例 const client = new Discord.Client(); // 这里放你的机器人登录、事件监听(比如ready事件)等代码 client.login('你的机器人Token'); // 关键:一定要导出client对象 module.exports = client;
如果之前没加module.exports = client,那你导入的client就是undefined,自然会报错。
第二步:简化ID获取逻辑
直接从message对象里拿服务器和频道ID就好,这是最直接准确的方式:
// 直接从message中提取,无需绕路 const serverId = message.guild.id; const channelId = message.channel.id;
第三步:修正LowDB写入代码
把获取到的ID存入数据库,建议把字段名改得更清晰(避免id、title这种表意模糊的命名):
db.get('posts') .push({ serverId: serverId, channelId: channelId }) .write();
3. 额外的健壮性建议
为了避免特殊情况报错,比如机器人在私聊频道被触发命令(此时message.guild会是undefined),可以加一层判断:
if (!message.guild || !message.channel) { return message.reply('请在服务器的频道内执行这个命令哦!'); }
如果用的是Discord.js v13及以上版本,client.guilds的API已经变更为client.guilds.fetch(),不过我们上面的写法完全避开了版本兼容问题,不需要担心这个。
内容的提问来源于stack exchange,提问作者Kenshi
相关产品推荐
相关产品推荐

