快递4.x上的EJS布局(迁移)

时间:2015-02-08 06:12:11

标签: node.js express migration ejs

我有一个测试应用程序在快递3.x上使用EJS运行视图(而不是jade),我能够创建布局并相应地使用它们。但最近迁移到表达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>

./视图/分音/ 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>

在此示例代码中,about视图加载时没有top_sidebar。因此我假设布局未正确加载。即使我强迫它这样做:res.render('about', { isAuthenticated: false, user: req.user, title: 'About', layout: "./layouts/layout.ejs" });

2 个答案:

答案 0 :(得分:4)

我终于找到了一个很好的模块来替换我的旧方法。我正在使用ejs-mate作为布局等。唯一的缺点是必须在视图文件而不是路由上指定布局。但在大多数情况下,这不应该是一个大问题。

答案 1 :(得分:0)

对于'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'可能不是正确的表达方式,但是对我有用...