【问题标题】:Mongoose: Cast to date failed for value when updating a documentMongoose:更新文档时,Cast to date 未能获得价值
【发布时间】:2020-09-08 23:27:19
【问题描述】:

我在我的项目中使用 Mongoose,在我使用日期字段的模式之一中,如下所示:

reservationDay: {
        type: Date,
        default: Date.now
}

我可以毫无问题地使用此字段创建文档。当我在创建此日期后 console.log 时,我得到:

reservationDay:  Thu Nov 20 2014 04:45:00 GMT+0100 (CET)

但是,当我尝试更新此文档时出现问题(即使没有更改 reservationDay 字段)。这是我收到的错误消息:

name: 'CastError',
  message: 'Cast to date failed for value "20/11/2014 04:11" at path "reservationDay"' } CastError: Cast to date failed for value "20/11/2014 04:11" at path "reservationDay"

这是我在服务器端更新此文档的方法:

Reservation.findOne({ _id: id }).exec(function(err, reservation) {
                        if (err) {
                            //handle
                        }
                        if (!reservation) {
                            //handle
                        }
                        reservation = extend(reservation, req.body);
                        reservation.save(function(err, updatedReservation) {
                            if (err) {
                                //handle
                            }
                            return res.json(reservation);
                        });
                    });

并且 req.body 中的日期没有更改。

任何想法可能导致此错误?

谢谢!

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    "20/11/2014 04:11" 是无效的 ISODate 格式。在某处您将 reservationDate 转换为无效格式的字符串。您需要将其转换为有效的 ISODate 格式(前一个月):

    new Date("11/20/2014 04:11") // Thu Nov 20 2014 04:11:00 GMT+0100 (CET)
    new Date("2014/11/20 04:11") // Thu Nov 20 2014 04:11:00 GMT+0100 (CET)
    new Date("20/11/2014 04:11") // Invalid Date
    

    为了方便操作日期格式,我建议使用moment.js

    【讨论】:

      【解决方案2】:

      使用 Moment JS 在 JavaScript 中将日期转换为 MongoDB ISODate 格式

      MongoDB 使用 ISODate 作为它们的主要日期类型。如果要将日期对象插入到 MongoDB 集合中,可以使用 Date() shell 方法。

      您可以通过将年份在 0 到 9999 之间的 ISO-8601 日期字符串传递给 new Date() 构造函数或 ISODate() 函数来指定特定日期。这些函数接受以下格式:

      • new Date("<YYYY-mm-dd>") 返回具有指定日期的 ISODate。
      • new Date("<YYYY-mm-ddTHH:MM:ss>") 指定客户端本地时区的日期时间,并返回具有指定日期时间的 ISODate UTC。
      • new Date("<YYYY-mm-ddTHH:MM:ssZ>") 以 UTC 格式指定日期时间,并以 UTC 格式返回具有指定日期时间的 ISODate。
      • new Date() 将日期时间指定为自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数,并返回生成的 ISODate 实例。

      如果您使用 JavaScript 编写代码,并且想要传递 JavaScript 日期对象并将其与 MongoDB 客户端一起使用,那么您要做的第一件事就是将 JavaScript 日期转换为 MongoDB 日期格式 (ISODate)。以下是你的做法。

          var today = moment(new Date()).format('YYYY-MM-DD[T00:00:00.000Z]');
          console.log("Next day -- " + (reqDate.getDate() + 1))
          var d = new Date();
          d.setDate(reqDate.getDate() + 1);
          var tomorrow = moment(d).format('YYYY-MM-DD[T00:00:00.000Z]');
      

      您可以使用新的 Date() shell 方法将今天和明天的对象传递给 MongoDB 查询。

        MongoClient.connect(con, function (err, db) {
          if (err) throw err
          db.collection('orders').find({ "order_id": store_id, "orderDate": {     
             "$gte": new Date(today), "$lt": new Date(tomorrow)}
           }).toArray(function (err, result) {
              console.log(result);
              if (err) throw err
                res.send(result);
          })
        })
      

      【讨论】:

        【解决方案3】:

        我想从我的错误中更新一点。

        检查您是否在一位数时间内错过了前导零。

        “2017-01-01T8:00:00”无效并会给出上述错误。

        “2017-01-01T08:00:00”有效

        【讨论】:

          猜你喜欢
          • 2017-01-08
          • 1970-01-01
          • 1970-01-01
          • 2017-08-13
          • 1970-01-01
          • 2013-09-22
          • 2017-01-15
          • 2018-09-29
          • 2020-07-09
          相关资源
          最近更新 更多