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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:37:45