web-dev-qa-db-ja.com

JadeテンプレートからExpress.jsリクエストまたはセッションにアクセスする

通常の応答で渡さずにJadeテンプレート内からExpress.jsのreqまたはセッション変数にアクセスする簡単な方法があるかどうか疑問に思っています。

それともこれが唯一の方法ですか?

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

Expressが使用するdynamicHelperを作成する必要があります。

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

次に、テンプレート内で<%= session.logged_in %>などを使用できます。

注:dynamicHelpersはExpress 3では非推奨です

20
Dominic Barnes

追加するだけ

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}
53
Ajouve

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としてアクセスできます。

46
David Weldon

ミドルウェアを使用するだけです。

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>
3
kaisa1028

これは私のために働いた

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

パグまたはジェイドビューのユーザー

#{user.email}
2
Sultan Zaid

JavaScriptにはスコープをエスケープして上方向にクロールする方法が常にありますが、私はreallyreally really really really別の方法を見つけることを強くお勧めします。

あなたが尋ねていることを考えてください:私の見解に私のコントローラーの根性を知らせてもらえますか?

またはあなたが本当に求めていること:私の見解に私のランタイムの根性を知らせてもらえますか?

ビューはデータを受け取り、それをマークアップに変換することになっています。それでおしまい。他に何かするなら、あなたはそれを間違っています。どれほど「簡単」かは気にしない。それがインターフェースのポイントです。渡されるものを正確に定義し、あるものを別のものに簡単に置き換えることができるようにします。

1
jcolebrand

これは、テンプレートでアクセス可能なローカル変数としてセッション変数を必要とするすべてのビューをレンダリングするために使用するレンダリング関数で解決できます(通常、ユーザーがログインしているときなど)。

これは関数の例ですが、好きなように調整できます:

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}
0
st0ne