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

discord.js中client.guilds、client.channels直接JSON.stringify输出空对象问题

问题原因
  • discord.js的Client类自定义了toJSON()序列化逻辑,直接序列化client实例时,会自动把guilds、channels这类管理器实例序列化为内部存储的资源ID数组,所以你能看到对应ID输出
  • client.guilds是GuildManager实例、client.channels是ChannelManager实例,这两个管理器类本身没有配置直接输出内部缓存集合的序列化逻辑,单独对这两个属性做JSON序列化就会得到空对象
解决方法

场景1:需要读取/操作guild、channel的实际数据

直接使用discord.js提供的管理器API访问缓存集合即可,不需要做JSON序列化:

module.exports = {
  name: 'command',
  execute(client) {
    // 获取所有服务器集合,返回Collection类型
    const allGuilds = client.guilds.cache
    // 遍历输出每个服务器的ID和名称
    allGuilds.forEach(guild => {
      console.log(`服务器ID:${guild.id},服务器名称:${guild.name}`)
    })

    // 获取指定ID的频道
    const targetChannel = client.channels.cache.get('替换为你的频道ID')
    if (targetChannel) {
      console.log(`频道名称:${targetChannel.name}`)
    }
  }
}

场景2:确实需要JSON序列化输出资源内容

可以手动调用缓存集合的toJSON()方法,或者自行构造需要的序列化结构:

// 序列化输出所有服务器的完整数据
console.log(JSON.stringify(client.guilds.cache.toJSON()))
// 序列化输出所有频道的完整数据
console.log(JSON.stringify(client.channels.cache.toJSON()))

// 如果只需要ID列表,可以直接提取缓存集合的键
console.log(JSON.stringify([...client.guilds.cache.keys()]))
console.log(JSON.stringify([...client.channels.cache.keys()]))

额外注意:如果你的命令是在客户端刚启动、还未触发ready事件时执行,可能会因为网关缓存未同步完成拿不到完整数据,建议所有操作guild、channel的逻辑都放在ready事件触发之后执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:15:05