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

为什么Express中路由定义顺序可解决express-ejs-layouts找不到layout报错

Express express-ejs-layouts 报错原因说明

核心原因

Express 的中间件、路由执行顺序完全遵循代码的编写先后顺序,express-ejs-layouts 中间件启用后,会默认要求视图目录下存在全局布局文件 layout.ejs。

两种情况的具体逻辑

  1. 先注册中间件、后写路由的报错场景
    你先执行了app.use(LAYOUT)启用布局中间件,再注册首页路由。当请求进入时,会先触发布局中间件的逻辑,渲染home.ejs时会自动去视图目录下查找默认的layout.ejs文件作为布局模板,你没有创建这个文件就会抛出找不到视图的错误。
  2. 先写路由、后注册中间件的正常运行场景
    你把首页路由写在了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 06:03:01