通常の応答で渡さずにJadeテンプレート内からExpress.jsのreqまたはセッション変数にアクセスする簡単な方法があるかどうか疑問に思っています。
それともこれが唯一の方法ですか?
res.render('/', {
session: req.session
});
Expressが使用するdynamicHelper
を作成する必要があります。
app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
次に、テンプレート内で<%= session.logged_in %>
などを使用できます。
注:dynamicHelpersはExpress 3では非推奨です
追加するだけ
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}
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
としてアクセスできます。
ミドルウェアを使用するだけです。
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}」を使用して、翡翠テンプレートでそれを参照できます。
User.isAnonymous()がtrueを返す場合、「req」に「user」オブジェクトがあり、「user」にメソッド「isAnonymous」があるとします。
p #{req.user.isAnonymous()}
としてレンダリングされます:
<p>true</p>
これは私のために働いた
app.use(function(req,res,next){
res.locals.user = req.user;
next();
});
パグまたはジェイドビューのユーザー
#{user.email}
JavaScriptにはスコープをエスケープして上方向にクロールする方法が常にありますが、私はreallyreally really really really別の方法を見つけることを強くお勧めします。
あなたが尋ねていることを考えてください:私の見解に私のコントローラーの根性を知らせてもらえますか?
またはあなたが本当に求めていること:私の見解に私のランタイムの根性を知らせてもらえますか?
ビューはデータを受け取り、それをマークアップに変換することになっています。それでおしまい。他に何かするなら、あなたはそれを間違っています。どれほど「簡単」かは気にしない。それがインターフェースのポイントです。渡されるものを正確に定義し、あるものを別のものに簡単に置き換えることができるようにします。
これは、テンプレートでアクセス可能なローカル変数としてセッション変数を必要とするすべてのビューをレンダリングするために使用するレンダリング関数で解決できます(通常、ユーザーがログインしているときなど)。
これは関数の例ですが、好きなように調整できます:
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}