猫鼬模式对象中的时间格式

时间:2019-06-02 09:56:27

标签: node.js mongoose mongoose-schema

我有如下所示的架构对象

 schedule: [{
        time: {
            type: Date,
            required: true
        }
    }]

,当我尝试将邮递员中的数据发布为

"schedule":[
      {
         "time":"18:00:00"
      }]

我遇到以下错误

  

验证失败:schedule.1.time:转换为日期失败,值“ 12:00:00”

如果我将 type 定义为String,则一切正常。

我认为定义接受时间的类型是错误的。谁能帮我更好的定义对象类型的方法

4 个答案:

答案 0 :(得分:2)

我有一个简单的问题要问,您是否要仅存储时间(没有日期成分,例如 18:00:00 )或作为时间戳(日期和时间,例如 2019-06-11T06:24:46.642Z )?

如果只是时间,那么很遗憾,您不能将其存储在date类型的字段中,因为它可以接受日期或时间戳记,而string类型可以接受任何任意字符串。

我要么建议将18:00:00存储为string,然后在检索或存储字段类型为timestamp的{​​{1}}之后以您想要的方式进行处理,然后将其与其对应的日期。

仅解释该错误,因为 date不是有效的表示日期的方法,因为该字段是按日期键入的。

答案 1 :(得分:0)

您已经注意到,您定义的字段类型与您要存储在其中的数据不匹配。如果您将其定义为类型:日期,则它将仅接受有效日期,而不会接受“ 18:00:00”。

根据我的理解,我认为最好的选择可能是存储有效的日期对象,即使您只打算在客户端显示或编辑代码中的时间。

另一种可能是在模型上声明三个数字字段:小时,分钟和秒。

编辑:

要存储所需的时间,该模型可能如下所示:

schedule: [{
    hours: {
        type: Number, required: true, min: 0, max: 23
    },
    minutes: {
        type: Number, required: true, min: 0, max: 59
    },
    seconds: {
        type: Number, required: true, min: 0, max: 59
    }
}]

我不知道您将如何处理这些数据,但是可以使用类似这样的函数来获取一个字符串,就像您尝试存储的字符串一样:

function timeToString(h, m, s) {
    if (h < 10) h = '0' + h;
    if (m < 10) h = '0' + h;
    if (s < 10) h = '0' + h;
    return h + ':' + m + ':' + s;
}

答案 2 :(得分:0)

查看它告诉的消息

  

时间:“转换为日期”的值失败

时间和日期是不同的

如果您需要使用下面的时间也可以

{ 
    "time":"2019-06-12T13:34:00.000"
}

答案 3 :(得分:0)

可以创建自定义类型并存储时间。但是我建议您将时间存储为字符串。在这种情况下,字符串易于解析,维护和检索。

添加这样的自定义验证。

time: {
    type: String,
    validate: {
      isAsync: true,
      validator: function(v, cb) {
        setTimeout(function() {
          var timeRegex = /^(?:2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]$/;
          var msg = v + ' is not a valid time format!';

          cb(timeRegex.test(v), msg);
        }, 5);
      },

      message: 'Default error message'
    },
    required: [true, 'Time is required']
  }