数据库查询后Details EJS页面无法显示,出现404错误求助
问题排查与解决
1. 修正EJS模板的字段访问错误
你在details.ejs里犯了一个明显的字段访问错误:MongoDB文档的_id是唯一标识ID,不是包含title和body的对象,直接访问blog._id.title会导致模板渲染失败,进而可能触发页面异常。
修正后的模板代码:
<div class="details content"> <h2><%= blog.title %></h2> <div class="content"> <p><%= blog.body %></p> </div> <a class="delete" data-doc="<%= blog._id %>">delete</a> </div>
同时要处理查询不到文档的情况,避免blog为null时模板报错:
Blog.findById(id) .then(result => { // 若ID对应文档不存在,返回404页面 if (!result) { return res.status(404).render('404', { title: 'Blog not found' }); } res.render('details', { title: 'Blog details ', blog: result }); }) .catch(err => { console.log(err); res.status(500).render('500', { title: 'Server Error' }); });
2. 检查路由配置的顺序与路径
Express会按路由定义的顺序匹配请求,如果你的404兜底路由(比如app.get('*', ...))放在了详情页路由之前,会优先匹配404,导致正确的ID请求也返回404。
正确的路由顺序示例:
// 详情页路由:必须放在404路由之前 app.get('/blogs/:id', (req, res) => { const id = req.params.id; console.log(id); Blog.findById(id) .then(result => { if (!result) { return res.status(404).render('404', { title: 'Blog not found' }); } res.render('details', { title: 'Blog details ', blog: result }); }) .catch(err => { console.log(err); res.status(500).render('500', { title: 'Server Error' }); }); }); // 404兜底路由:必须放在所有路由最后 app.get('*', (req, res) => { res.status(404).render('404', { title: 'Page Not Found' }); });
另外要确认列表页的跳转链接路径和详情路由一致,比如跳转链接应该是:
<a href="/blogs/<%= blog._id %>">查看详情</a>
3. 验证数据库查询结果
在then回调里打印查询结果,确认是否真的获取到了文档:
.then(result => { console.log('查询到的博客:', result); // 查看控制台输出是否为null // 后续渲染逻辑 })
如果输出为null,说明该ID对应的博客不存在,这时候返回404页面是合理的;如果有结果但仍返回404,继续排查路由配置。
4. 确认模板文件路径
确保details.ejs放在了Express配置的模板目录下(默认是views/文件夹),如果模板文件路径错误,Express找不到模板也会触发页面异常。
内容的提问来源于stack exchange,提问作者Russell Flaherty
相关产品推荐
相关产品推荐

