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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:09:21