2017-04-03 2 views
1

私は多くのDateインスタンスを持つオブジェクトを持っている状況があります。オブジェクトは、JSONに変換され、返されます。expressのルートハンドラでプロトタイプメソッドを一時的に上書きすることは安全ですか?

router.post('/', function() { 
    // Some code that returns the object 
    res.status(200).json(object); 
}); 

を私はDateすべてのオブジェクトは、JSONに変換されているので、私はこれをやって考えていた方法を変更する必要があります。

私はこれがひどい練習であることを認識していますが、私はその意味合いが何であるか不思議です。オブジェクトがJSONに変換された直後に元の状態に戻すので、res.status(200).json(object)の要求が実行され、上書きされる可能性がありますか?Date.prototype.toJSON

+0

それはあなた自身の機能でJSオブジェクト=> JSON変換を処理する代わりに、可能でしょう?よりクリーンで、プロトタイプを混乱させる必要はなく、まったく同じように動作します。 'res.status(200).json(toJSON(オブジェクト));'。 – DrakaSAN

答えて

3

コードが完了して実行され、JSONメソッドの2つの変更の間に発生したり待っているため、コードの他の部分が変更されたJSONメソッドを使用することは問題ではありませんが、あなたのコードはあなたの変更されたメソッドを使用しないでしょう - それは実際にはres.json()の実装に依存し、今は動作するかもしれませんが、将来的にはExpressの内部実装が変更され、将来の破損のリスクを伴う抽象化。

あなたがここにいくつか他のものを行うことができます。

  1. あなたは日付のために、独自のカスタムオブジェクトを使用すると、それはしかし、あなたが望む変換することができます。
  2. あなたは
  3. あなたの利点にJSON.stringifyのreplacerパラメータを使用することができますが、オブジェクト全体のためにカスタムオブジェクトを使用することができます内蔵の特急機能
  4. に頼る代わりにJSONを用意し、独自の機能を使用することができますstrigifyするために、数3の番号1

と日付だけでなく、参照:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

代替パラメータは関数または配列のいずれかとすることができます。関数として、2つのパラメータ、キーと値が文字列化されます。キーが見つかったオブジェクトは、Replacerのthisパラメータとして提供されます。最初は、文字列化されるオブジェクトを表す空のキーで呼び出され、文字列化されるオブジェクトまたは配列の各プロパティに対して呼び出されます。 [...] Stringを返すと、その文字列はJSON文字列に追加する際にプロパティの値として使用されます。あなたの特定のケースで

代用

はちょうどあなたが欲しいしかし、フォーマットされた日付を返し、そのまま他のすべてを返すことができます。そのような場合のためにreplacerパラメーター JSON.stringify()が作成されます。

0

このような場合、すべてが同期しているため、一度に実行されます。そのように、それを行うことは安全でなければなりません。

しかし、プロトタイプをいじりはあなたの問題をはるかに簡単な解決策がある場合は特に、多くの場合、悪い考えです:

function toJSON(input) { 
    if(typeof input === 'date') { 
     return moment(input).format(); 
    } else if(typeof input === 'object') { 
     let o = {}; 

     Object.keys(input).map((key) => { 
      o[key] = toJSON(input[key]); 
     }); 

     return o; 
    } else { 
     return input; 
    } 
} 

router.post('/', function() { 
    var originalToJSON = Date.prototype.toJSON; 
    Date.prototype.toJSON = function() { 
     return moment(this).format(...); // some formatting function 
    } 
    res.status(200).json(toJSON(object)); 
    Date.prototype.toJSON = originalToJSON; 
}); 
関連する問題