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
问题排查与解决
你的代码存在两个核心问题导致页面持续加载:
express.json未调用,中间件失效
代码中app.use(express.json);缺少括号,正确写法是app.use(express.json());。express.json是一个函数,必须调用才能返回处理JSON请求的中间件,未调用会导致请求处理流程阻塞。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密钥
验证步骤
- 修正代码后重启服务器;
- 访问
http://localhost:5000,应看到根路由的响应内容; - 访问不存在的路由,会跳转至错误页面并显示对应错误信息。
内容的提问来源于stack exchange,提问作者pifflox
相关产品推荐
相关产品推荐

