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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:53:31