28

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

或者这是唯一的方法?

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

8 回答 8

56

只需添加

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}
于 2013-09-28T18:28:35.703 回答
46

在 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.

于 2012-11-26T20:03:57.223 回答
21

您需要创建一个dynamicHelper供 Express 使用。

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

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

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

于 2011-06-13T17:34:19.990 回答
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' 对象,并且 'user' 有一个方法 'isAnonymous',如果你的 user.isAnonymous() 返回 true,

p #{req.user.isAnonymous()}

将呈现为:

<p>true</p>
于 2013-03-21T08:21:08.583 回答
3

这对我有用

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

在哈巴狗或翡翠视图用户

#{user.email}
于 2017-07-09T17:31:33.443 回答
0

虽然 javascript 中总有一种方法可以逃脱范围并向上爬行,但我真的真的真的真的真的非常非常强烈地鼓励你找到另一种方法。

考虑一下您要问的问题:我可以让我的视图了解我的控制器的内容吗?

或者你真正要问的是:我可以让我的观点了解我的运行时的胆量吗?

视图应该获取数据并将其转换为标记。就是这样。如果你做任何其他事情,你就做错了。我不在乎它有多“容易”。这就是接口的意义所在。准确定义正在传递的内容,并使其易于用另一件事替换一件事。

于 2011-06-13T14:49:56.457 回答
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)
});

在您的翡翠模板中,您可以像这样访问会话变量:

div.user-email #{session.user_email}
于 2017-10-19T11:32:27.027 回答
0

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

变体

在功能

sess=req.session

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

于 2021-02-25T22:55:27.490 回答