从Jade模板访问Express.js req或session

时间:2011-06-13 14:28:12

标签: node.js express pug

我想知道是否有一种简单的方法可以从Jade模板中访问Express.js的req或会话变量,而不通过正常响应传递它。

或者这是唯一的方法吗?

res.render('/', {
    session: req.session
});

8 个答案:

答案 0 :(得分:53)

添加

app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));
app.use(function(req,res,next){
    res.locals.session = req.session;
    next();
});

app.use(app.router);

让你的会话进入玉器

p #{session}

答案 1 :(得分:45)

在express 3.x中,已删除dynamicHelpers,因此您需要使用中间件和res.locals的组合。假设我们想要在req.query视图中访问/signup/new

localQuery = function(req, res, next) {
  res.locals.query = req.query;
  next();
};

newSignup = function(req, res) {
  res.render('signup/new');
};

app.get('signup/new', localQuery, newSignup);

现在任何使用localQuery中间件的路由都会设置res.locals.query。然后,您可以在视图中将其作为query

进行访问

答案 2 :(得分:20)

您需要为Express创建dynamicHelper才能使用。

app.dynamicHelpers({
    session: function (req, res) {
        return req.session;
    }
});

然后在模板中,您可以使用<%= session.logged_in %>或其他任何内容。

注意:Express 3中不推荐使用dynamicHelper

答案 3 :(得分:3)

只需使用中间件。

app.use(function (req, res, next) {
            var origRender = res.render;
            res.render = function (view, locals, callback) {
                if ('function' == typeof locals) {
                    callback = locals;
                    locals = undefined;
                }
                if (!locals) {
                    locals = {};
                }
                locals.req = req;
                origRender.call(res, view, locals, callback);
            };
            next();
});

之后您可以使用“#{req}”在玉石模板中引用它。

假设'req'中有'用户'对象,'user'有一个方法'isAnonymous', 如果你的user.isAnonymous()返回true,

p #{req.user.isAnonymous()}

将呈现为:

<p>true</p>

答案 4 :(得分:2)

这对我有用

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

在帕格或玉视图用户

#{user.email}

答案 5 :(得分:1)

虽然javascript中总有一种方法可以逃避范围并向上爬行,但我真的真的真的真的 真的 < / strong>强烈建议你找另一种方式。

考虑一下你的问题:我可以让我的观点了解我的控制器的胆量吗?

或者您真正在问的问题:我可以让我的观点了解运行时的内容吗?

视图应该采用数据并将其转换为标记。而已。如果你做了别的什么,你做错了。我不在乎它有多“简单”。这就是界面的重点。准确定义传递的内容,并使用其他东西轻松替换一件事。

答案 6 :(得分:0)

您可以使用渲染函数解决此问题,您可以使用渲染函数将需要会话变量的每个视图渲染为模板中可访问的局部变量(例如,通常在用户登录时)。

以下是一个功能示例,但您可以根据需要进行调整:

var renderView = function(res, template, context, session, cb) {
    context.session = session;

    if(cb){
        res.render(template, context, function(error, html){
            cb(error, html)
        }
    } else {
        res.render(template, context)
    }
}

然后就可以这样使用:

app.get("/url", function(req, res){

    req.session.user_email = user_email;

    renderView(res, "template_name", { local_variables: local_variables }, req.session)
});

在您的jade模板中,您可以访问会话变量,如下所示:

div.user-email #{session.user_email}

答案 7 :(得分:0)

如果您的会话对象变量是全局声明的,那么 在全球

变量访问

在函数中

sess=req.session

req.render('index.pug',{sess})