2017-01-16 8 views
1

私のres.json関数が自分のデータを変更しているようです。関数にデータを記録すると、適切なデータが返されます。 res.json内だけでデータが変更されますが、理由を把握することはできません。res.jsonが誤って変更された入力を返す

例:

function unixToDate(timestamp) { 
    var a = new Date(timestamp * 1000); 
    //console.log(a); 
    var rgx = /T(\d{2}):(\d{2}):(\d{2}).(\d{3})Z/; 
    var newA = JSON.stringify(a); 
    //console.log(newA.replace(rgx, "")); 
    return newA.replace(rgx, ""); 
} 

ルート再び

router.get('/:unix', function(req, res) { 
    var timestamp = req.params.unix; 
    var regex = new RegExp("\\d{10}"); 
    if (regex.test(timestamp)) { 
    var date = unixToDate(timestamp); 
    console.log(date); 
    res.json({ unix : timestamp, naturalFormat : date }); 
    } else { 
    res.json({ unix: null, naturalFormat : null}); 
    } 
}); 

私は正規表現で初心者くさいだと私は推測していたならば、それはそれとは何かをしなければなりません。代わりに{"unix":"1484600306","naturalFormat":"2017-01-16"}を返すのでは{"unix":"1484600306","naturalFormat":"\"2017-01-16\""}.

関数を返します。

PS私の日付が間違っている、つまり12/01/2015ではなく、2015年11月30日であるため、toString()を使用しませんでした。そのため、正規表現でこのようにしました。

ありがとうございました!

+1

これはXYの問題です。 Dateオブジェクトの周りをハックしないでください。あなたのユースケースにはmomentjsを使用してください。 – Amberlamps

答えて

1

ここでの問題は、unixToDateである:引用符を含む"2017-01-16T00:00:000.000Z":あなたはnewAは、このような文字列であることを意味JSON、などの日付をシリアル化している

var newA = JSON.stringify(a); 

。その後、res.jsonを呼び出すと、その文字列を再度シリアライズします。

最も簡単な解決策は、代わりにDate.prototype.toISOStringを使用することです。実際に

var newA = a.toISOString(); 

String.prototype.replaceと日付の時間部分を除去するあなたの方法は少し複雑である:それは引用符なしで、上記と同じ文字列を返します。 ISO 8601の日付は常に各桁の数字の桁数が同じなので、String.prototype.sliceを使用しないのはなぜですか?

function unixToDate(timestamp) { 
    var date = new Date(timestamp * 1000); 
    return date.toISOString().slice(0, 10); 
} 
+0

素晴らしい!私は@amberlampsの提案を評価しますが、私が間違っていたことを知る必要がありました。完璧!ありがとうございました! – Quesofat

+1

Moment.jsは素晴らしいです。それはしばしば過度のものです。 –

関連する問題