为什么Express中路由定义顺序可解决express-ejs-layouts找不到layout报错
Express express-ejs-layouts 报错原因说明
核心原因
Express 的中间件、路由执行顺序完全遵循代码的编写先后顺序,express-ejs-layouts 中间件启用后,会默认要求视图目录下存在全局布局文件 layout.ejs。
两种情况的具体逻辑
- 先注册中间件、后写路由的报错场景
你先执行了app.use(LAYOUT)启用布局中间件,再注册首页路由。当请求进入时,会先触发布局中间件的逻辑,渲染home.ejs时会自动去视图目录下查找默认的layout.ejs文件作为布局模板,你没有创建这个文件就会抛出找不到视图的错误。 - 先写路由、后注册中间件的正常运行场景
你把首页路由写在了app.use(LAYOUT)之前,这个路由的处理逻辑完全不会被布局中间件拦截,渲染home.ejs时不会启用布局功能,自然不会去查找layout.ejs文件,所以不会报错。但这种写法下,布局中间件对这个首页路由完全不生效,如果你后续写的其他路由注册在布局中间件之后,渲染时还是会抛出相同的找不到layout的错误。
正确处理方案
如果你需要使用ejs布局功能:
- 在
resources/views目录下新建layout.ejs作为全局布局模板,示例内容如下:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>站点标题</title> </head> <body> <%- body %> <!-- 此处会插入你指定渲染的视图文件内容,比如home.ejs的代码 --> </body> </html>
- 保持正确的代码注册顺序:先配置视图相关设置,再注册布局中间件,最后注册路由,确保所有路由都能正常使用布局功能:
const express = require("express"); const app = express(); const PATH = require("path"); const LAYOUT = require("express-ejs-layouts"); const PORT = process.env.PORT || 3000; // 第一步:配置视图参数 app.set("views", PATH.join(__dirname,"/resources/views")); app.set("view engine", "ejs"); // 第二步:注册布局中间件 app.use(LAYOUT); // 第三步:注册业务路由 app.get("/", (req, res) => { res.render('home'); }); app.listen(PORT, () => { console.log(`Listening on port ${PORT}...`); });
如果你不需要使用布局功能,直接删除app.use(LAYOUT)这行代码即可,无需调整代码顺序也不会报错。
内容的提问来源于stack exchange,提问作者Ayondip Jana
相关产品推荐
相关产品推荐

