如何将 MongoDB 中保存的客户端日期保留为日期?

How to keep date from client saved in MongoDB as date?

我正在使用 Node.js 和 Angular.js 进行网络项目。我知道如果日期是使用 new Date() 在服务器上创建的(例如 2015-04-08 04:15:18.712Z 在 Robomongo 中显示为 Date 类型),则该日期将保存为日期。但是,如果日期是在客户端使用 new Date() 创建的,那么它会被保存为一个字符串(例如 2015-04-07T04:58:12.771Z 在 Robomongo 中显示为 String 类型),因为它通过节点 API 变成了一个字符串。如何将其保存为日期而不是字符串?

更新: 这是我根据 Jason Cust 的意见得到的。在节点的 server.js 中指定 reviver 选项如下:

app.use(bodyParser.json({ reviver: function(key, value) {
    if ( typeof value === 'string' && value.length === 24) {
        if (value.match(/^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/)){
            return new Date(value);
        }
    }
    return value;
}}));

当数据从客户端发送到服务器时,这将自动将所有日期字符串转换为日期对象。

如果你想为 Angular.js 客户端做同样的事情,我发现了 Andrew Davey 的一篇很好的博客 Automatic JSON date parsing with AngularJS

我假设您正在使用 JSON 将日期从 Angular 应用程序发送到您的 Node 应用程序。 JSON spec 不会重构 Date 对象,因此在将其插入 MongoDB.

之前,您必须先自己完成

示例:

// simulate JSON from HTTP request
var json = JSON.stringify({date: new Date()});
console.log(json);
// outputs: '{"date":"2015-04-08T04:50:04.252Z"}'
var obj = JSON.parse(json);
console.log(obj);
// outputs: { date: '2015-04-08T04:50:04.252Z' }
// reconstitute Date object
obj.date = new Date(obj.date);
console.log(obj);
// outputs: { date: Wed Apr 08 2015 00:50:04 GMT-0400 (EDT) }