2017-01-16 4 views
1

Функция res.json меняет мои данные. Если я зарегистрирую данные в функции, он вернет правильные данные. Только внутри res.json меняют данные, и я не могу понять, почему.res.json, возвращающий непреднамеренно измененный ввод

Для примера. Вместо возврата {"unix":"1484600306","naturalFormat":"2017-01-16"} возвращает {"unix":"1484600306","naturalFormat":"\"2017-01-16\""}.

функция:

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

Опять я NEWB с регулярным выражением, и если я должен был догадаться, что бы что-то делать с этим ,

PS Я не использовал toString(), потому что моя дата не срабатывала i.e 11/30/2015 вместо 12/01/2015, поэтому я сделал это с регулярным выражением.

Спасибо!

+1

Это проблема XY. Не взламывайте свой объект вокруг объекта Date. Используйте momentjs для вашего прецедента. – Amberlamps

ответ

1

Проблема заключается в unixToDate, здесь:

var newA = JSON.stringify(a); 

Вы сериализации Дата как JSON, что означает newA будет строка, как это: "2017-01-16T00:00:000.000Z", включая кавычки. Затем, когда вы вызываете 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 является удивительным. Это также часто бывает излишним. –

Смежные вопросы