【问题标题】:Wrong date in moment.js when used with express.js与 express.js 一起使用时,moment.js 中的日期错误
【发布时间】:2018-01-01 13:44:41
【问题描述】:

有快递

const express = require('express');
const moment = require('moment');

const app = express();

const generateSearchRange = (year) => (month) => {
    return {
        start: 0,
        stop: moment([year]).endOf('year')
    }
};

app.get('/foo/:year', (req, res) => {
   const year = req.params.year; // 2017
    res.send(generateSearchRange(year)(12)); // { "start": 0, "stop": "2016-12-31T22:59:59.999Z" }
});

app.listen(3000);

不含快递

const moment = require('moment');

const generateSearchRange = (year) => (month) => {
    return {
        start: 0,
        stop: moment([year]).endOf('year')
    }
};

console.log(generateSearchRange(2017)(12)); // { start: 0, stop: moment("2017-12-31T23:59:59.999") }

我不明白同一个函数给我两个不同的输出是怎么回事。

【问题讨论】:

  • 我猜由于在这种情况下响应需要字符串,它隐式调用时刻对象上的 toString 方法,因此您在响应中得到它的字符串表示形式。我建议您在发送前将数据记录在 express 中,它应该与您在独立脚本上看到的内容确认
  • @Malice 看看下面我的回答。我发现这段代码在虚拟机中可以正常工作,所以这与我的操作系统有关。现在我需要找到这个问题:D
  • 你能试试我的建议吗

标签: javascript node.js express momentjs


【解决方案1】:

它适用于我。我刚刚复制了你的代码

【讨论】:

  • 也许你应该确保浏览器中的参数是 2017 并且没有中间件与参数混淆
  • 你是对的。我在虚拟机上运行它,一切正常。所以这与我的系统有关。有什么想法可能是这个问题的根源吗?
  • @gregooroo 我刚刚用 git bash 在 windows 上运行了代码,得到了同样的不匹配。您是否使用类似的设置?
【解决方案2】:

express 使用 moment 的字符串表示来构造响应。它调用 toString 方法来做到这一点。您可以通过在添加响应之前记录日期来确认这一点。

let date = generateSearchRange(year)(12);
console.log(date)
res.send(date);

【讨论】:

  • 好的。我这样做了。现在在控制台中我看到 "{ start: 0, stop: moment("2017-12-31T23:59:59.999") }" 但在 postman { "start": 0, "stop": "2017-12-31T22: 59:59.999Z" } 在我的操作系统上运行此代码时,输​​出仍然错误。
  • 是的,这意味着您的中间件正在将时刻对象转换为日期字符串,这是标准行为。响应需要渲染字符串,但是你传递了一个对象来构造响应,所以 express 转换为字符串。
  • 好的,但是当我在我的虚拟机(我自己的 vagrant box - 使用 debian 8)上运行相同的代码时,一切正常。
  • 工作得很好,你在邮递员的 api 响应中得到moment() 吗?
  • 我打赌你在虚拟机上使用不同的节点/时刻版本
猜你喜欢
  • 2015-04-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2019-01-05
  • 2020-01-22
  • 2013-07-25
相关资源
最近更新 更多