[英]Accessing Express.js req or session from Jade template
我想知道是否有一種簡單的方法可以從 Jade 模板中訪問 Express.js 的 req 或 session 變量,而無需通過正常響應傳遞它。
或者這是唯一的方法?
res.render('/', {
session: req.session
});
只需添加
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);
並在翡翠中獲得您的 session
p #{session}
在 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
的形式訪問它。
您需要創建一個dynamicHelper
供 Express 使用。
app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
然后在您的模板中,您可以使用<%= session.logged_in %>
或其他任何東西。
注意:在 Express 3 中不推薦使用 dynamicHelper
只需使用中間件。
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' object,並且'user'有一個方法'isAnonymous',如果你的user.isAnonymous()返回true,
p #{req.user.isAnonymous()}
將呈現為:
<p>true</p>
這對我有用
app.use(function(req,res,next){
res.locals.user = req.user;
next();
});
在哈巴狗或翡翠視圖用戶
#{user.email}
您可以使用渲染 function 來解決此問題,您可以在其中渲染每個需要 session 變量作為模板中可訪問的局部變量的視圖(例如,通常在用戶登錄時)。
這是 function 的示例,但您可以隨意調整:
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)
});
在您的玉模板中,您可以像這樣訪問 session 變量:
div.user-email #{session.user_email}
雖然在 javascript 中總有一種方法可以逃離 scope 並向上爬行,但我真的真的真的真的非常非常強烈地鼓勵你找到另一種方法。
考慮一下您要問的問題:我可以讓我的觀點了解我的 controller 的膽量嗎?
或者你真正要問的是:我可以讓我的觀點了解我的運行時的膽量嗎?
視圖應該獲取數據並將其轉換為標記。 而已。 如果你做任何其他事情,你就做錯了。 我不在乎它有多“容易”。 這就是接口的意義所在。 准確定義正在傳遞的內容,並使其易於用另一件事替換一件事。
如果您的 session object 變量是全局聲明的,那么在全局
變體
在 function
sess=req.session
req.render('index.pug',{sess})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.