Express控制器中next()未触发,MEAN栈评论更新新闻问题求助
问题分析与解决方案
嘿,我一眼就发现问题所在啦——你的路由配置只挂载了addComment这一个处理函数,根本没把updateNews加入到同一个请求的处理链里!Express的路由支持传入多个中间件函数,它们会按顺序依次执行,你现在的写法相当于只让addComment处理这个POST请求,自然不会触发updateNews。
下面是具体的修复步骤:
1. 修改路由配置,串联两个中间件
把你的路由代码改成这样,让addComment执行完调用next()后,自动进入updateNews的处理流程:
const express = require("express"); var CommentsController = require('../controllers/commentsController'); const router = express.Router(); // 把两个控制器函数作为连续参数传入,形成处理链 router.post("", CommentsController.addComment, CommentsController.updateNews); module.exports = router;
2. 修正addComment里的细节错误
你现在把未保存的comment实例赋值给了req.createdComment,但save()返回的createdComment才是实际存入数据库、带有自动生成_id的完整文档,应该用它来赋值:
exports.addComment = (req, res, next) => { const comment = new Comment({ /* 你的键值对 */ }); comment .save() .then(createdComment => { // 替换为保存后的真实文档 req.createdComment = createdComment; next(); }) // 别忘了添加错误处理,避免请求挂起无响应 .catch(err => { res.status(500).json({ message: "Failed to save comment", error: err }); }); };
3. 优化updateNews的Promise逻辑(可选但推荐)
你当前的代码嵌套了Promise,容易陷入回调地狱,而且缺少错误处理,建议改成链式调用,同时调整MongoDB的操作规范:
exports.updateNews = (req, res, next) => { let newsId = req.body.newsId; let comment = req.createdComment; News.findById(newsId) .then(news => { if (!news) { throw new Error("Target news not found"); } // 推荐用updateOne替代旧版update API,同时只存评论的_id而非完整文档(符合MongoDB关联设计) return News.updateOne({ _id: newsId }, { $push: { comments: comment._id } }); }) .then(item => { res.status(201).json({ message: "Comment added successfully" }); }) .catch(err => { res.status(500).json({ message: "Failed to update news", error: err }); }); }
小提示:后续查询新闻时,可以用
News.findById(newsId).populate('comments')来关联获取完整的评论内容,这种设计比直接存整个评论文档更灵活、更节省存储空间。
这样修改后,当你提交评论请求时,就会先执行addComment保存评论,然后通过next()自动触发updateNews更新对应的News文档啦。
内容的提问来源于stack exchange,提问作者Satyam
相关产品推荐
相关产品推荐

