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

Mongoose模型调用findById无法获取Promise且执行中断如何解决

问题排查与修复方案
  • 首要原因是变量名语法错误:你声明数组时写的var getProductDocs Promises = []存在多余空格,属于非法变量命名,导致后续调用getProductDocsPromises.push()时访问的是未定义变量,直接抛出未捕获的引用错误,是程序卡住报错的直接诱因。
  • 其次可能存在this指向异常:如果你的成员方法没有正确绑定this,或是用箭头函数定义的Schema方法,会导致this.productsTracking读取失败,调用forEach时直接抛出错误。
  • 还可能存在异步异常未捕获的问题:Product.findById().exec()返回的Promise如果遇到ObjectId格式非法、数据库连接断开、Product模型未正确引入的情况,会抛出未处理的Promise rejection,表现为无明确信息的空白报错。

修复后代码示例

// 修正变量名,删除多余空格
const getProductDocsPromises = []
// 提前校验productsTracking格式,避免调用forEach报错
if (Array.isArray(this.productsTracking)) {
  this.productsTracking.forEach((productObjectId) => {
    // 给单条查询添加错误捕获,避免单条查询失败导致整体抛出
    getProductDocsPromises.push(
      Product.findById(productObjectId)
        .exec()
        .catch(err => {
          console.error('单条商品查询失败:', err)
          return null
        })
    )
  })
}
// 批量等待所有查询完成,同时添加全局异常捕获
const productDocs = await Promise.all(getProductDocsPromises).catch(err => {
  console.error('批量商品查询失败:', err)
  return []
})

优化方案

你可以直接使用Mongoose自带的populate关联查询能力,无需手动循环查询,代码更简洁不易出错:

// 直接填充productsTracking字段关联的Product文档
await this.populate('productsTracking')
// 执行完成后this.productsTracking就已经是完整的商品文档数组了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:15:03