res.json返回无意中修改的输入

时间:2017-01-16 20:57:49

标签: javascript json node.js express

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

我再次使用正则表达式,如果我不得不猜测它会与此有关。

PS我没有使用toString(),因为我的日期出错了,即2015年11月30日而不是2015年1月12日这就是为什么我用正则表达式这样做的原因。

谢谢!

1 个答案:

答案 0 :(得分: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);
}