EJS文章页面无法加载,仅重启服务器后可正常渲染的问题求助
排查EJS博客文章页面加载停滞问题的思路
嘿,我来帮你拆解这个有点诡异的问题——明明数组清空后理论上没数据,却能渲染页面,而有数据时反而加载停滞,这确实反直觉。结合你的代码,我整理了几个实用的排查方向:
1. 核心漏洞:未匹配到文章时无响应返回
你的/posts/:postName路由有个关键问题:只有找到匹配的文章才会调用res.render,如果没找到任何匹配内容,服务器不会返回任何响应,这就导致浏览器一直处于等待状态(也就是你看到的加载停滞)。
至于重启服务器(清空posts数组)后能渲染页面,大概率是这两种情况:
- 浏览器缓存了之前成功渲染的页面;
- 你重启后重新发布了一篇文章,此时posts数组里有了匹配内容,
res.render被正常调用了。
2. 先确认是否真的匹配到了文章
给路由加些日志,就能明确问题出在哪。修改你的路由代码:
app.get("/posts/:postName", function(req, res){ const requestedTitle = _.lowerCase(req.params.postName); console.log("请求的标题(转换后):", requestedTitle); let postFound = false; posts.forEach(function(post){ const storedTitle = _.lowerCase(post.title); console.log("存储的标题(转换后):", storedTitle); if (storedTitle === requestedTitle) { console.log("找到匹配文章,开始渲染..."); res.render("post", { title: post.title, content: post.content }); postFound = true; }; }); // 必须处理找不到文章的情况,避免请求挂着 if (!postFound) { console.log("未找到匹配的文章"); res.status(404).render("404", { message: "抱歉,这篇文章不存在!" }); } });
启动服务器后访问出问题的页面,看终端日志:
- 如果看不到"找到匹配文章"的日志,说明标题转换后不匹配,或者posts数组里根本没有这篇文章;
- 如果看到日志但页面仍加载停滞,就要检查EJS模板或响应发送环节的问题。
3. 用更高效的查找方式替代forEach
forEach会遍历所有文章,哪怕已经找到匹配内容还会继续循环,既低效又可能因误操作多次调用res.render(会导致Express报错)。改用find方法更靠谱:
app.get("/posts/:postName", function(req, res){ const requestedTitle = _.lowerCase(req.params.postName); const foundPost = posts.find(post => _.lowerCase(post.title) === requestedTitle); if (foundPost) { res.render("post", { title: foundPost.title, content: foundPost.content }); } else { res.status(404).send("文章不存在"); } });
4. 检查EJS模板的潜在错误
虽然你说重启后能渲染,但如果模板使用了未定义的变量,EJS会抛出错误导致服务器无法响应。给你的app添加错误处理中间件,捕获这类问题:
// 放在所有路由之后 app.use(function(err, req, res, next) { console.error("模板渲染错误:", err.stack); res.status(500).send("页面渲染出错了!"); });
这样如果模板有问题,你能在终端看到具体错误信息。
5. 验证全局posts数组的真实状态
重启服务器后posts数组会被清空,你可以在路由里打印数组,确认里面是否真的有数据:
app.get("/posts/:postName", function(req, res){ console.log("当前posts数组:", posts); // ... 其他逻辑 });
说不定你重启后不经意间重新发布了文章,数组里已经有内容了呢?
内容的提问来源于stack exchange,提问作者Carl Diamond
相关产品推荐
相关产品推荐

