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

