Express.js CRUD应用更新功能重定向异常问题求助
问题诊断与修复方案
我来帮你排查这两个问题的根源:
1. 重定向URL错误(/post/show/:pid)
你在更新路由的回调里犯了一个变量未定义的错误:
res.redirect('/post/show/' + pid); // 这里的pid根本没有声明过!
你代码里只定义了post.pid = req.body.post_id,但这个post.pid是局部对象的属性,不是独立变量。更关键的是:你完全不需要这个pid字段——你更新帖子是基于URL里的:id(也就是MongoDB自动生成的_id)来操作的,直接用req.params.id就能拿到正确的帖子ID。
2. 模板报错“Cannot read property 'title' of undefined”
这个错误是重定向错误的连锁反应:因为你重定向到了一个无效的ID(未定义的pid导致URL里是无效值),Post.findById找不到对应的帖子,返回的post是undefined,渲染模板时访问post.title自然就报错了。
修复后的完整代码
更新路由代码(修正变量错误+简化逻辑)
// Update post app.post('/post/edit/:id', function(req, res){ // 只收集需要更新的字段,去掉多余的pid let postData = { title: req.body.title, category: req.body.category, body: req.body.body }; let query = {_id: req.params.id}; // 用req.params.id做重定向,这是当前帖子的有效ID Post.update(query, postData, function(err){ if (err) { console.log(err); return; } else { res.redirect('/post/show/' + req.params.id); } }); });
简化后的编辑表单(删除多余的隐藏字段)
h2 #{title} form(action="/post/edit/" + post._id, method="POST") .form-group input.form-control(type="text", name="title", placeholder="Post title" value=post.title) .form-group input.form-control(type="text", name="category", placeholder="Post category" value=post.category) .form-group textarea.form-control(rows="5", name="body")= post.body .form-group input.btn.btn-sm.btn-block.btn-primary(type="submit", value="Update")
进阶优化建议
推荐使用Mongoose的findByIdAndUpdate方法,它更简洁且能返回更新后的文档,可靠性更高:
// Update post(优化版) app.post('/post/edit/:id', function(req, res){ const { title, category, body } = req.body; // { new: true } 配置会让方法返回更新后的文档 Post.findByIdAndUpdate(req.params.id, { title, category, body }, { new: true }, function(err, updatedPost){ if (err) { console.log(err); return; } else { res.redirect('/post/show/' + updatedPost._id); } }); });
这样修改后,重定向会指向正确的帖子展示页面,模板也能拿到有效的post数据,两个问题都会解决。
内容的提问来源于stack exchange,提问作者Razvan Zamfir
相关产品推荐
相关产品推荐

