我有如下所示的架构对象
schedule: [{
time: {
type: Date,
required: true
}
}]
,当我尝试将邮递员中的数据发布为
时"schedule":[
{
"time":"18:00:00"
}]
我遇到以下错误
验证失败:schedule.1.time:转换为日期失败,值“ 12:00:00”
如果我将 type
定义为String
,则一切正常。
我认为定义接受时间的类型是错误的。谁能帮我更好的定义对象类型的方法
答案 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']
}