22

これが基本的なセットアップです。ルートからクライアント側の JavaScript に直接データを簡単に渡すことができるシンプルなミドルウェア コンポーネントを作成しようとしています。(Ruby のGon gem に非常に似ています)。私がやっている方法は、次のようなモジュールを使用することです。

    module.exports = function(){
    return function(req,res,next){
        var app = req.app;
        if(typeof(app) == 'undefined'){
            var err = new Error("The JShare module requires express");
            next(err);
            return;
        }
        res.jshare = {};
        app.dynamicHelpers({
            includeJShare: function(req,res){
                if(typeof(res.jshare) === 'undefined'){
                    return "";
                }
                return function(){
                    return '<script type="text/javascript">window.jshare=' + JSON.stringify(res.jshare) + '</script>';
                } 
            }
        });
        next();
    };
}

次に、私のルートでこれを行うことができます:

exports.index = function(req, res){
  res.jshare.person = {firstName : "Alex"};
  res.render('index', { title: 'Express' })
};

最後に、layout.jade で:

!{includeJShare()}

それが行うことは、サーバー側で作成された正確な JSON オブジェクトを作成するクライアント上の JavaScript の行を出力することです。

これが質問です。それはすべて期待どおりに機能しますが、一般的に Express と Node.js に慣れていないので、応答オブジェクトにプロパティをアタッチしても問題ないのか、それとも単に見落としているだけで何か問題があるのでしょうか? 何らかの理由で「においテスト」に合格しませんでしたが、その理由はわかりません....

4

3 に答える 3

40

これが古いスレッドであることは承知していますが、このトピックに追加するものが他にあります。

Express には、response.localsこの目的のためのオブジェクトがあります。ミドルウェアからの応答を拡張して、ビューで使用できるようにします。

応答オブジェクトにプロパティを直接追加できます。@hasanyasin が示すように、JavaScript の設計方法です。しかし、より具体的に言えば、Express には、私たちが好む特定の方法があります。

これは Express 3.x の新機能かもしれませんが、確かではありません。おそらく、この質問がされた時点では存在していなかったでしょう。

詳細については、を参照してください。

http://expressjs.com/en/api.html#res.locals

app.localsリクエストごとに(またはレスポンスからレスポンスまで)変化しない for オブジェクトもあります。

http://expressjs.com/en/api.html#app.locals

参照: req.locals 対 res.locals 対 res.data 対 req.data 対 Express ミドルウェアの app.locals

于 2013-03-12T20:35:36.953 に答える
15

全然OKです。それが JavaScript の設計方法です。注意すべき唯一のことは、既存のプロパティを誤ってオーバーライドしたり、他のプロパティによってオーバーライドされたりしないようにすることです。より安全にするために、req/res オブジェクトにすべてを直接追加する代わりに、より深いレベルに進むことを検討してください。

res.mydata={}
res.mydata.person= ...

そのように。

于 2012-07-05T03:49:43.233 に答える
-1

res.locals応答オブジェクトにカスタム変数を含めるために使用します。

于 2020-11-15T10:57:55.390 に答える