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

