【问题标题】:res.json returning unintentionally modified inputres.json 返回无意修改的输入
【发布时间】:2017-01-16 20:57:48
【问题描述】:

我的 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 年 12 月 1 日,所以这就是我使用正则表达式这样做的原因。

谢谢!

【问题讨论】:

  • 这是一个 XY 问题。不要绕过 Date 对象。将 momentjs 用于您的用例。

标签: javascript json node.js express


【解决方案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);
}

【讨论】:

  • 太棒了!!我重视@amberlamps 的建议,但我需要知道我做错了什么。完美的!谢谢!
  • Moment.js 很棒。这也常常是矫枉过正。
猜你喜欢
  • 2023-01-05
  • 2014-12-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多