NodeJS+MongoDB+Express博客应用:提交后按ID重定向失败求助
解决博客重定向后"Cannot GET /users/postpage/[ID]"的问题
看起来你遇到的核心问题是GET路由的路径格式错误,导致重定向后的URL无法匹配到对应的路由处理逻辑。咱们一步步来修复:
1. 修正GET路由的路径与逻辑
你的users.js里的GET路由写法有两处错误:
- 路径缺少开头的斜杠
/,Express路由需要明确的路径起始标识 - 参数占位符格式错误,应该是
:id而不是:/id(冒号要直接跟参数名,不能插入斜杠)
而且原来的路由只是返回ID,没有从数据库查询文章并渲染页面,这也需要补充。修正后的代码:
// 记得先引入Createpost模型 const Createpost = require('../models/Createpost'); router.get('/postpage/:id', async (req,res)=>{ try { // 根据ID从数据库查询对应的文章 const post = await Createpost.findById(req.params.id); if (!post) { return res.status(404).send("抱歉,这篇文章不存在"); } // 渲染postpage.ejs并传递文章数据 res.render('postpage', { post: post }); } catch (error) { console.error("获取文章失败:", error); res.status(500).send("服务器内部错误"); } })
2. 优化POST路由的重定向与错误处理
原POST路由里有两个小问题:
- 重定向时用
newPost.id虽然能工作,但MongoDB文档的原生ID是_id,用newPost._id更规范 - 错误渲染页面时,路径应该是
postpage而不是users/postpage(你的views文件直接放在根目录下)
修正后的POST路由:
router.post('/postpage', async (req,res)=> { let newPost = new Createpost({ postTitle: req.body.postTitle, postText: req.body.postText }) try { newPost = await newPost.save(); // 重定向到新文章的详情页 res.redirect(`/users/postpage/${newPost._id}`); } catch (error){ console.error("保存文章失败:", error); // 回显用户之前输入的内容,方便重新提交 res.render('postpage', { postTitle: req.body.postTitle, postText: req.body.postText }); } })
3. 修复postpage.ejs的表单与展示逻辑
你的ejs文件里有几个需要调整的地方:
- 输入框的
type属性写错了,应该是type="text"而不是type="postTitle"/type="postText" - 缺少提交按钮,用户无法完成表单提交
- 需要添加文章展示逻辑,当从GET路由进入时显示文章内容
修正后的postpage.ejs:
<!-- 表单部分:用于创建新文章 --> <% if (typeof post == 'undefined') { %> <form action="/users/postpage" method="POST"> <div class="form-group"> <label for="postTitle">Title</label> <input required type="text" id="postTitle" name="postTitle" class="form-control" placeholder="Enter title" value="<%= typeof postTitle != 'undefined' ? postTitle : '' %>" /> </div> <div class="form-group"> <label for="postText">Text</label> <input required type="text" id="postText" name="postText" class="form-control" placeholder="Enter text" value="<%= typeof postText != 'undefined' ? postText : '' %>" /> </div> <button type="submit" class="btn btn-primary">发布文章</button> </form> <% } %> <!-- 文章展示部分:当查询到文章时显示 --> <% if (typeof post != 'undefined') { %> <div class="mt-4"> <h1><%= post.postTitle %></h1> <p class="lead"><%= post.postText %></p> <small class="text-muted">发布时间:<%= post.date.toLocaleString() %></small> </div> <% } %>
最后检查几个关键点
- 确保
users.js顶部正确引入了Createpost模型:const Createpost = require('../models/Createpost'); - 确认
app.js里已经挂载了users路由:app.use('/users', require('./routes/users'));
这样修改后,当用户提交表单时,数据会保存到MongoDB,然后重定向到对应的详情页,就能正常展示文章内容了。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

