从Jade模板访问Express.js请求或会话

我想知道是否有一个简单的方法来访问Express.js的需求或会话variables从一个Jade模板中,而不通过正常的响应传入。

或者这是唯一的方法?

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

       

网上收集的解决方案 "从Jade模板访问Express.js请求或会话"

您需要创build一个dynamicHelper使用。

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

然后在你的模板里,你可以使用<%= session.logged_in %>或其他。

注意:ExpressHelper中不赞成使用dynamicHelpers

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

 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在您的视图中进行访问。

只需添加

 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} 

只是使用中间件。

 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> 

虽然在JavaScript中总有一种方法可以逃避范围并向上爬,但我确实真的非常强烈地鼓励你find另一种方式。

考虑你在问什么:我可以让我的观点知道我的控制器的胆量吗?

或者你真的在问:我可以让我的视图知道我的运行时间的胆量吗?

一个视图应该把数据转换成标记。 而已。 如果你做别的事,你做错了。 我不在乎它是多么“容易”。 这是一个界面的要点。 要准确定义传递的内容,并使用另一件事物来replace一件事情变得容易。

这对我工作

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

在帕格或玉观看用户

 #{user.email} 

你可以用一个渲染函数来解决这个问题,在这个渲染函数中,你需要将每个需要会话variables的视图渲染成模板中可以访问的局部variables(通常是用户login的时候)。

这是一个函数的例子,但你可以随意调整:

 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) }); 

在你的玉石模板中,你可以像这样访问会话variables:

 div.user-email #{session.user_email}