2012-07-05 3 views
11

これは基本的な設定です。私は簡単にミドルウェアコンポーネントを作成して、クライアント側のjavascriptに直接ルートからデータを簡単に渡すことができます。 (非常にルビーのGon宝石に似ています)。 layout.jadeで最後にExpress.jsのミドルウェアモジュールのレスポンスオブジェクトにデータを追加することはできますか?

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

私のルートに私はこれを行うことができ、その後

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(); 
    }; 
} 

:私はそれをやっている方法は、次のようになりますモジュールを持つことです

!{includeJShare()} 

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

ここに質問があります。それはすべて期待どおりに動作しますが、ExpressやNode.jsには一般的ではありませんが、レスポンスオブジェクトにプロパティを付けることは問題ないのでしょうか?何らかの理由で私の "臭いテスト"に合格しませんが、どうしても分かりません.....

答えて

10

それは完全にOKです。 JavaScriptがどのように設計されているかです。注意する必要があるのは、既存のプロパティを誤って上書きしたり、他のプロパティによって上書きされたりしないことだけです。代わりのreq/resをオブジェクトに直接、すべてを追加することで、より安全であるために、あなたはより深いレベルを行く考えるかもしれません:そのような

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

を。

+0

ご回答ありがとうございます。私のコードサンプルを見ると、私は深いところに行くと信じています。私は "res.jshare.person"を持っています。それはあなたが意味することですか? – BFree

+0

はい、それはまさに私が意味していたものです。私はあなたのコードを批判するつもりはなかった、私はただそれを強調したかった。だからあなたはすでにそれを正しくしていて、jshareは別のライブラリで使われるようになる一般的な言葉のようには見えません。それは良いです。 :) – hasanyasin

+0

私は理由も考えることはできませんが、私はより一般的に要求に追加されたものを見た。ノードとConnect/Expressのパワーは、これらのオブジェクトを周囲から渡すことによってもたらされ、各レイヤーは独自の方法でそれらを拡張します。 Expressは、たとえばsend()をレスポンスオブジェクトに追加します。 –

35

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

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

レスポンスオブジェクトに直接プロパティを追加することができます。また、@hasanyasinで示されているように、JavaScriptの設計方法もあります。しかしExpressは、具体的には、彼らが私たちがやることを好む特定の方法を持っています。

これは、Express 3.xで新しくなる可能性があります。おそらく、この質問が尋ねられたときには存在しなかったでしょう。詳細について

、要求(または私は仮定応答への応答)への要求から変化しないオブジェクトに対するapp.localsもあり

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

を参照してください。

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

+0

おい、あなたのリンクは壊れていて、私はこれのリファレンスを見つけることができません? – Himmators

+1

Expressチームは、WebサイトのURLパターンをロケールコードに変更しました。この回答のリンクを更新して正しく動作する "en"を使用しました。 – Brandon

+0

これは良い答えです@Bfree、あなたはそれを変更する必要があります! – Himmators

関連する問題