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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:22:34