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

Mongoose中UnhandledPromiseRejectionWarning报错原因排查

解决Mongoose populate时的UnhandledPromiseRejectionWarning问题

兄弟,我一眼就看到你代码里的问题了,这个UnhandledPromiseRejectionWarning主要是两个核心原因导致的:

1. Promise的then回调参数顺序完全搞反了

Mongoose的exec()返回的Promise对象,then()方法的第一个参数是成功回调函数,接收查询到的结果;第二个参数才是错误回调函数,接收错误信息。你现在写的:

.then(function(err, articlesByCategory) {
  if(err) throw err;
  console.log(articlesByCategory);
})

这里的err其实是查询成功后的articlesByCategory结果,而articlesByCategory是undefined。真正的错误根本没被捕获,当查询出现问题时,Promise的rejected状态没有被处理,就会抛出UnhandledPromiseRejectionWarning。

2. 缺少Promise错误捕获机制

就算参数顺序对了,你只用了throw err,但在Promise链里直接throw错误如果没有被catch()捕获的话,同样会触发这个警告。

正确的写法应该是这样:

function getPostByCategory(req, res, next) {
  category_article_model.find({category: req.params.name})
    .populate('article')
    .exec()
    .then(function(articlesByCategory) { // 第一个参数是成功返回的结果
      console.log(articlesByCategory);
      // 别忘了给前端返回响应
      res.status(200).json(articlesByCategory);
    })
    .catch(function(err) { // 用catch统一捕获所有错误
      console.error('查询分类文章出错:', err);
      next(err); // 或者给前端返回错误响应,比如res.status(500).json({error: err.message})
    });
}

另外还有个小细节要优化:你的category_article模型定义时变量名重复了,容易引发混淆,建议改成更规范的写法:

var categoryArticleSchema = new Schema({ 
  "article_id": { type: String, required: false, unique: false }, 
  "category": String, 
  "article": { type: mongoose.Schema.Types.ObjectId, ref: 'article'}, 
}); 
var CategoryArticle = mongoose.model('CategoryArticle', categoryArticleSchema); 
module.exports = CategoryArticle;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:03:49