Express EJS Layouts:res.locals不在布局

时间:2016-07-13 13:50:35

标签: javascript node.js templates express ejs

我在Express 4中使用Express EJS Layouts模块。

我不确定如何标记这个,但我遇到的问题是这个。我有路线文件,布局和视图。我正尝试使用以下代码将页面标题页面描述传递到布局。

路线

router.get('/', function(req, res, next) {

  res.locals.meta = {
    title: 'Page Title',
    description: 'Page Description'
  };

  res.render('pages/index', {
    header: 'Page Header'
  });
});

布局

<!DOCTYPE html>
<html dir="ltr" lang="en" class="no-js">
<head>
  <title><%= meta.title %></title>
  <meta name="description" content="<%= meta.description %>">
</head>
<body>
  <%- body %>
</body>
</html>

查看

<h1 class="page-title"><%= header %></h1>

标题会在视图中呈现,但它缺少页面标题页面描述。如果我将其他项添加到res.locals.meta对象并在视图中引用它们,则会渲染它们,但不会呈现布局中的任何内容。

我做错了什么?

非常感谢所有帮助。

2 个答案:

答案 0 :(得分:1)

您是否尝试在添加这些项目后重新启动节点服务器并刷新页面?另外,您是否在视图中扩展了布局?

我假设express-ejs-layouts允许您在新视图中继承默认布局文件。如果是,则新视图继承(即扩展)父布局。

看起来你应该将父布局设置为:

app.set('view engine', 'ejs')
app.set('layout', 'myLayout') // defaults to 'layout' 

然后,您将自动继承该视图,并调用您的特定内容视图:

app.get('/', function(req, res){
  res.render('aView', { layout: 'someSpecificLayout' })
})

我的猜测是

  1. 视图没有继承,因为该文件不存在 app.set('layout', 'myLayout')

    1. 未正确使用父标记
    2. 标头按原样呈现,因为它被设置为响应变量。 someSpecificLayout中的代码应与<%- contentFor('meta.title') %>类似,父级布局myLayout应为<%= meta.title %>

答案 1 :(得分:1)

meta字段始终在express-ejs-layout设置,无论设置为the option to extract meta tags

现在已经fixed,因此请更新到最新版本的express-ejs-layout以解决问题。