2013-02-24 8 views
19

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

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

現在、res.renderへの私の呼び出しは、次のようになります。私はユーザーreq.userを削除してミドルウェア機能に追加したいと思います。

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

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

[app.get前()とapp.post()、すべてのHTTP要求にフックを実行?](http://stackoverflow.com/questions/13106300 ) – laggingreflex

答えて

27

Expressは、ルートハンドラによってrenderに渡された明示的な地元の人々とapp.localsres.locals、それautomatically mergesを提供します。

また、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(); 
}); 
+0

私が試した最初のことは動作しません。 res.renderは、そのメソッドが壊れるオブジェクトの一部です。 –

+0

['call'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call)を介して' render'のコンテキストを保持する必要があります。 – josh3736

+0

私はそれがうまくいくと思います。おそらくそれを行うより正しい方法である地元の人々を介して別の方法を見つけましたか?ありがとう! –

9

はそれを考え出した:それは余分なオーバーヘッドですが、何らかの理由で、あなたのルートハンドラが実行される前に入手できない情報を渡すために必要であれば、それはオプションですので、私はこれを避けるためと思います。

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

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>

+5

実際には、テンプレートに' _locals'を使うべきではありません。 Expressは自動的にその内部変数をトップレベルオブジェクトにマージします(https://github.com/visionmedia/express/blob/3.1.0/lib/application.js#L467-474)。 – josh3736

関連する問題