express 4.x 上的 EJS 布局(迁移)
EJS layouts on express 4.x (migration)
我在 express 3.x 上有一个测试应用程序 运行,视图使用 EJS(而不是 jade),我能够创建布局并相应地使用它们。但最近迁移到 express 4.x 并且除了布局之外一切都很好。布局似乎没有正确加载或根本没有加载。
是否有某种新模块需要加载?我错过了什么?我尝试将布局硬编码到我的 res.render 参数中,但没有采用。我什至为应用程序本身设置了默认布局。
./views/layouts/layout.ejs(所有视图的默认布局
<!DOCTYPE html>
<html>
<head>
<% include partials/head %>
</head>
<body>
<% include partials/top_sidebar %>
<%- body %>
</body>
<% include partials/footer %>
</html>
./views/partials/top_sidebar.ejs
<a href = "/" >Home</a>
<a href = "/about" >About</a>
<a href = "/contact" >Contact</a>
<% if (!isAuthenticated) { %>
<a href = "/login" >Login</a>
<% } else { %>
<a href = "/user" >Profile</a>
<a href = "/" >Jobs</a>
<a href = "/logout" >Logout</a>
<% } %>
app.js(路由器调用'/about')
router.get('/about', function(req, res, next){
res.render('about', { isAuthenticated: false, user: req.user, title: 'About' });
});
./views/about.ejs
<h1><%= title %></h1>
<p>Something that gives about information.</p>
在此示例代码中,关于视图加载时没有 top_sidebar。因此我假设布局没有正确加载。即使我强迫它这样做:res.render('about', { isAuthenticated: false, user: req.user, title: 'About', layout: "./layouts/layout.ejs" });
我终于找到了一个很好的模块来代替我的旧方法。我在布局等方面使用 ejs-mate。唯一的缺点是必须在视图文件而不是路由上指定布局。但在大多数情况下,这应该不是什么大问题。
对于 'ejs-mate' - 我还想出了如何添加所有视图通用的默认布局文件(您仍然可以根据请求覆盖它,如上所述)。
// view engine setup
app.engine('ejs', ejsMate);
app.locals._layoutFile = 'layouts/default'; //this default can be overridden per request
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
使用 'app.locals._layoutFile' 可能不是正确的表达方式,但它对我有用...
我在 express 3.x 上有一个测试应用程序 运行,视图使用 EJS(而不是 jade),我能够创建布局并相应地使用它们。但最近迁移到 express 4.x 并且除了布局之外一切都很好。布局似乎没有正确加载或根本没有加载。
是否有某种新模块需要加载?我错过了什么?我尝试将布局硬编码到我的 res.render 参数中,但没有采用。我什至为应用程序本身设置了默认布局。
./views/layouts/layout.ejs(所有视图的默认布局
<!DOCTYPE html>
<html>
<head>
<% include partials/head %>
</head>
<body>
<% include partials/top_sidebar %>
<%- body %>
</body>
<% include partials/footer %>
</html>
./views/partials/top_sidebar.ejs
<a href = "/" >Home</a>
<a href = "/about" >About</a>
<a href = "/contact" >Contact</a>
<% if (!isAuthenticated) { %>
<a href = "/login" >Login</a>
<% } else { %>
<a href = "/user" >Profile</a>
<a href = "/" >Jobs</a>
<a href = "/logout" >Logout</a>
<% } %>
app.js(路由器调用'/about')
router.get('/about', function(req, res, next){
res.render('about', { isAuthenticated: false, user: req.user, title: 'About' });
});
./views/about.ejs
<h1><%= title %></h1>
<p>Something that gives about information.</p>
在此示例代码中,关于视图加载时没有 top_sidebar。因此我假设布局没有正确加载。即使我强迫它这样做:res.render('about', { isAuthenticated: false, user: req.user, title: 'About', layout: "./layouts/layout.ejs" });
我终于找到了一个很好的模块来代替我的旧方法。我在布局等方面使用 ejs-mate。唯一的缺点是必须在视图文件而不是路由上指定布局。但在大多数情况下,这应该不是什么大问题。
对于 'ejs-mate' - 我还想出了如何添加所有视图通用的默认布局文件(您仍然可以根据请求覆盖它,如上所述)。
// view engine setup
app.engine('ejs', ejsMate);
app.locals._layoutFile = 'layouts/default'; //this default can be overridden per request
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
使用 'app.locals._layoutFile' 可能不是正确的表达方式,但它对我有用...