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

