Node.js - 如何在EJS视图中使用我的局部变量

时间:2014-05-29 21:25:23

标签: javascript node.js templates ejs

我尝试在EJS上使用我的局部变量。检查用户是否已连接只是可变的。 - >就像这个链接上的最后一篇文章: How to know if user is logged in with passport.js?

所以,

app.js

app.use(function (req, res, next) {
    res.locals.login = req.isAuthenticated();
    next();
});

查看EJS

<% if (login) { %>
      <div id="subMenuUser">
        <div class="btn-group">
          <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
            </span>Menu<span class="caret"></span>
          </button>
          <ul class="dropdown-menu pull-right" role="menu">
            <li><a href="#" role="menuitem">Menu Item 1</a></li>
            <li><a href="#" role="menuitem">Menu Item 2</a></li>
            <li><a href="#" role="menuitem">Menu Item 3</a></li>
          </ul>
        </div>
      </div>
 <% } %>

我收到错误消息:

login is not defined

我想在所有视图中使用此变量..可能吗?

在此方法之前,我每次都将我的变量发送到渲染中:

res.render('ad/index', { login: req.session.user });

2 个答案:

答案 0 :(得分:3)

确保在宣布app.router之前声明设置res.locals.login的中间件功能。这可确保在中间件设置res.locals.login之前,呈现模板的路由不会呈现模板。有点像:

app.use(function (req, res, next) {
    res.locals.login = req.isAuthenticated();
    next();
});

app.configure(function(){
    ...
    app.use(app.router);
    ...
});

似乎其他人提出了类似的问题,但是使用了其他模板引擎:Accessing res.locals from Backbone.Router templates

答案 1 :(得分:0)

或者,如果您不想创建中间件,也可以直接在ejs文件中使用以下检查:

if(locals.login) { .... }