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

localhost:5000服务器持续加载无法显示EJS模板求助

问题描述

我正在学习Node.js,之前参考Express文档搭建的服务器能正常运行。但引入dotenv、http-errors、ejs等npm包后,创建.env文件声明PORT=5000,在main.js中引入并调用app.listen函数,访问http://localhost:5000时页面持续加载无内容,终端无错误输出,只能通过Ctrl+C终止进程。


相关代码文件

main.js

const express = require("express");
const dotenv = require("dotenv");
const mongoose = require("mongoose");
const path = require("path");
const cookieParser = require("cookie-parser");
const { notFoundHandler, errorHandler } = require("./middlewares/common/errorHandler");


const app = express();
dotenv.config();


//database connection
mongoose.set("strictQuery", true);
mongoose.connect(process.env.MONGO_CONNECTION_STRING, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
})
.then(() => console.log("Database Conntcted!"))
.catch(err => console.log(err));

app.use(express.json);
                  
app.use(express.urlencoded({ extended: true }));


app.set("view engine", "ejs");
app.set('views', 'views');

app.use(express.static(path.join(__dirname, "public")));


app.use(cookieParser(process.env.COOKIE_SECRET));


app.use(notFoundHandler);

//common error handler
app.use(errorHandler);


app.listen(process.env.PORT, () => {
  console.log(`app is listing at port ${process.env.PORT}`);
});

errorHandler.js

const createError = require("http-errors");


function notFoundHandler(req, res, next) {
  next(createError(404, "CONTENT WAS NOT FOUND!"));
}

function errorHandler(err, req, res, next) {
  res.render("error", {
    title: "Error Page",
  });
}

module.exports = {
  notFoundHandler: notFoundHandler,

  errorHandler,
 
};

error.ejs(路径./views/error.ejs)

<title><%= title %></title>
<body>
    Alart!
</body>

.env文件

PORT=5000

问题排查与解决

你的代码存在两个核心问题导致页面持续加载:

  1. express.json未调用,中间件失效
    代码中app.use(express.json);缺少括号,正确写法是app.use(express.json());。express.json是一个函数,必须调用才能返回处理JSON请求的中间件,未调用会导致请求处理流程阻塞。

  2. notFoundHandler挂载顺序错误,无有效路由响应
    你把notFoundHandler挂载在所有路由之前,导致任何请求都会直接触发404错误。但后续的errorHandler中,res.render因模板结构不完整可能出现渲染异常,最终导致响应未结束,页面持续加载。

另外还有几个潜在问题需要修正:

  • .env缺少MONGO_CONNECTION_STRING和COOKIE_SECRET,会导致数据库连接失败、cookie解析异常;
  • error.ejs缺少完整HTML结构,可能引发模板渲染错误;
  • errorHandler未设置响应状态码,无法正确返回错误状态。

修正后的关键代码

main.js 核心调整

// 修正express.json调用
app.use(express.json());

// 添加根路由示例(需根据实际业务补充路由)
app.get('/', (req, res) => {
  res.send('服务器正常响应');
});

// 将notFoundHandler移至所有路由之后
app.use(notFoundHandler);
app.use(errorHandler);

errorHandler.js 优化

function errorHandler(err, req, res, next) {
  // 设置错误状态码
  res.status(err.status || 500);
  res.render("error", {
    title: "Error Page",
    errMsg: err.message
  });
}

error.ejs 补全结构

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title><%= title %></title>
</head>
<body>
    <h1>Alert!</h1>
    <% if (errMsg) { %>
      <p>错误信息:<%= errMsg %></p>
    <% } %>
</body>
</html>

.env 补充必要配置

PORT=5000
MONGO_CONNECTION_STRING=你的MongoDB连接字符串
COOKIE_SECRET=自定义Cookie密钥

验证步骤

  1. 修正代码后重启服务器;
  2. 访问http://localhost:5000,应看到根路由的响应内容;
  3. 访问不存在的路由,会跳转至错误页面并显示对应错误信息。

内容的提问来源于stack exchange,提问作者pifflox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:01:30