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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:43:11