25

エクスプレスミドルウェアまたは別の方法を使用res.renderして、アプリルートの各呼び出しにレンダリングデータ(の2番目のオプション)を追加することは可能ですか?

私のアプリは認証にパスポートを使用しており、ミドルウェアがレンダリングされた各テンプレートに常にユーザー情報を追加するようにしたいと思います。

現在、私の各呼び出しはにres.render似ています。user : req.userを削除してミドルウェア機能に追加したいと思います。

// Page 1
res.render("somepage1",{data : "somepage1", user : req.user});

// Page 2
res.render("somepage2",{data : "somepage2", user : req.user});
4

2 に答える 2

35

Expressはとを提供しますapp.localsres.localsこれは、ルートハンドラーによって渡された明示的なローカルと自動的にマージされます。render

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

または、関数にホットパッチを適用することもできrenderます。余分なオーバーヘッドがあるため、これは避けたいと思いますが、何らかの理由で、ルートハンドラーを実行する前に利用できない情報を渡す必要がある場合は、次のオプションがあります。

app.use(function(req, res, next) {
    var render = res.render;
    res.render = function(view, locals, cb) {
        if (typeof locals == 'object') locals.user = req.user;
        render.call(res, view, locals, cb);
    };
    next();
});
于 2013-02-24T23:23:54.717 に答える
11

理解した。

ミドルウェアでローカルを使用できます。

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

次に、テンプレートで使用します。

<h1>User Name:{{user.name}}</h1>

<h1>User Name:{{_locals.user.name}}</h1>

于 2013-02-24T23:27:19.750 に答える