レンダリング変数:app.localsおよびres.locals



Render Variables App



上記のテンプレートでは、ブログ、ユーザー、成功、およびエラーの変数を使用しました。ブログ変数をapp.localsにマウントしました次に、ユーザーのマウント、成功、エラーをres.locals下。なぜそうするのですか?app.locals res.localsでそれは何ですか?それらの違いは何ですか?

テンプレートのレンダリングに使用できるExpressのオブジェクトは2つあります:app.locals res.localsで。エクスプレスソースコードを見てみましょう。



express / lib / application.js

app.render = function render(name, options, callback) { ... var opts = options var renderOptions = {} ... // merge app.locals merge(renderOptions, this.locals) // merge options._locals if (opts._locals) { merge(renderOptions, opts._locals) } // merge options merge(renderOptions, opts) ... tryRender(view, renderOptions, done) }

express / lib / response.js



res.render = function render(view, options, callback) { var app = this.req.app var opts = options || {} ... // merge res.locals opts._locals = self.locals ... // render app.render(view, opts, done) }

見ることができます:通話中res.renderその時点で、expressは3つの場所の結果をマージし、レンダリングされるテンプレートを渡します。優先順位は次のとおりです:res.render着信オブジェクト> res.localsオブジェクト> app.localsオブジェクト、そうapp.locals res.localsでほとんど違いはありません。テンプレートのレンダリングに使用されます。使用方法の違いは次のとおりです。app.locals通常、一定の情報(ブログ名、説明、作成者情報など)がマウントされます。res.locals通常、変数情報はマウントされます。つまり、可能な値はリクエストごとに異なります(リクエスター情報、res.locals.user = req.session.userなど)。

index.jsを変更しますroutes(app)次のコードを前の行に追加します。

/ / Set the template global constant app.locals.blog = { title: pkg.name, description: pkg.description } // Add the three variables required for the template app.use(function (req, res, next) { res.locals.user = req.session.user res.locals.success = req.flash('success').toString() res.locals.error = req.flash('error').toString() next() })

これはres.renderと呼ばれますこれらの4つの変数を渡す必要はなく、Expressは自動的にマージしてテンプレートを渡すので、これらの4つの変数をテンプレートで直接使用できます。