Express开发Discord机器人报TypeError: botGuilds.find is not a function解决方案
问题原因
TypeError: botGuilds.find is not a function报错的核心是getMutualGuilds函数接收的botGuilds参数不是数组类型,因此不具备数组的find方法。
排查步骤
- 先验证
getBotGuilds()的返回值格式,在调用getMutualGuilds前添加打印语句:console.log(typeof guilds, Array.isArray(guilds), guilds),确认返回值是否为数组 - 常见的
botGuilds非数组场景:- 调用Discord接口请求失败,返回值为错误对象、null或undefined
- 接口返回嵌套结构,guild列表被包裹在响应对象的
data字段中,直接将整个响应对象传入了函数 - 使用discord.js相关API时,返回的是GuildManager实例而非原始数组,需要额外转换为数组格式
修复方案
- 先给
getMutualGuilds添加参数校验,避免异常场景下程序崩溃,同时去掉多余的await调用(该方法是同步方法,不需要await):
// utils.js修改后代码 function getMutualGuilds(userGuilds, botGuilds) { if (!Array.isArray(userGuilds) || !Array.isArray(botGuilds)) return [] return userGuilds.filter((guild) => botGuilds.find((botGuild) => (botGuild.id === guild.id) && (guild.permissions & 0x20) === 0x20)) } // 路由调用处去掉await const mutualguilds = getMutualGuilds(userGuilds, guilds);
- 根据
getBotGuilds的实现逻辑调整返回值格式:- 如果是用axios等请求库调用Discord开放接口,取响应的data字段:
const guilds = (await getBotGuilds()).data - 如果是用discord.js的客户端实例获取guild列表,转换为数组:
const guilds = client.guilds.cache.map(g => g.toJSON())
- 如果是用axios等请求库调用Discord开放接口,取响应的data字段:
内容的提问来源于stack exchange,提问作者musicas e fabulas
相关产品推荐
相关产品推荐

