discord.js报错own.map is not a function embed嵌入消息异常
报错诱因分析
own.map is not a function 报错的核心原因是调用数组方法.map()时,变量own不是数组类型。结合当前技术栈场景,具体触发原因如下:
- 数据库存储值类型不符合预期:
@turph/quickmongo读取${process.env.owner}.owner键返回的值不是数组,可能是历史写入时误存为单个用户ID字符串、数字、普通对象,甚至是未初始化完成返回的非数组文档结构,这类值不存在数组原型上的map方法,调用直接报错。 - 现有判空逻辑存在漏洞:
!own仅能拦截null、undefined、空字符串、0这类假值,如果own是字符串类型的用户ID这类非数组真值,判空分支不会触发,会直接执行map调用触发报错。 - 代码附带两个会导致分页逻辑完全失效的隐藏bug:
if(ownc === null|| "Nan" )判断永远成立:非空字符串"Nan"是固定真值,无论ownc实际读取到什么值,都会被强制赋值为1;另外此处存在拼写错误,JS中表示非数字值的是全局属性NaN,不是字符串"Nan"。- 分页页数计算优先级错误:
Math.ceil(ownc||1/ 30)受运算符优先级影响,会先计算1/30,实际等价于Math.ceil(ownc || 0.033),只要ownc是真值就会直接返回ownc本身,完全没有执行每页30条的页数计算。
修复方案
- 读取
own后增加强类型校验兜底,强制保证其为数组类型:如果读取到的值不是数组,做兼容处理——如果是单个合法用户ID字符串就自动转为单元素数组,其他非法值默认赋值为空数组,从根源上避免map调用报错。 - 修正
ownc的判断逻辑,正确处理null、NaN场景,移除永远为真的判断分支,优先用own数组的实际长度做兜底值,避免计数和实际存储不一致。 - 调整分页计算的运算优先级,给除法运算增加括号,保证页数计算逻辑正确。
- 把分页大小抽为常量,避免后续调整分页参数时出现漏改。
修复后可直接运行的代码如下:
let own = await db.get(`${process.env.owner}.owner`) let ownc = await db.get(`${process.env.owner}.ownercount`) const pageSize = 30; let page = 1; // 强制own为数组类型,兼容历史脏数据 if (!Array.isArray(own)) { own = typeof own === 'string' && own.trim() ? [own] : [] } // 修正ownc判断逻辑,处理null、NaN场景,用数组实际长度兜底 if (ownc === null || Number.isNaN(ownc)) { ownc = own.length } let embed = new Discord.MessageEmbed() embed.setTitle("Owner") .setColor(color) .setDescription( own.length === 0 ? "None" : own.map((user, i) => `[${i}] <@${user}>`).slice(0, pageSize).join("\n") ) // 修正运算优先级,正确计算总页数 .setFooter(`${page}/${Math.ceil(ownc / pageSize)} • ${footer}`) message.channel.send(embed)
内容的提问来源于stack exchange,提问作者Sans
相关产品推荐
相关产品推荐

