猫鼬模式对象中的时间格式
Time format in mongoose scheema Object
我有如下模式对象
schedule: [{
time: {
type: Date,
required: true
}
}]
当我尝试将 post 中的数据 post 作为
"schedule":[
{
"time":"18:00:00"
}]
我遇到以下错误
validation failed: schedule.1.time: Cast to Date failed for value "12:00:00"
如果我将 type
定义为 String
,一切正常。
我认为我定义接受时间的类型是错误的。谁能帮我更好地定义对象类型
如您所见,您定义的字段类型与您要在其中存储的数据不匹配。如果您将其定义为类型:日期,它将只接受有效日期,而“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;
}
我有一个简单的问题要问你,你想只存储 时间(没有日期部分,例如 18:00:00) 或作为 时间戳 (日期和时间,例如 2019-06-11T06:24:46.642Z)?
如果只是时间,那么不幸的是你不能将它存储在 date
类型字段中,因为它接受日期或时间戳,而 string
类型可以接受任意字符串。
我建议将 18:00:00
存储为 string
,然后在检索后以您想要的方式进行处理,或者存储字段类型为 date
的 timestamp
并使用它及其相应的日期。
只是为了解释错误,这是因为 18:00:00
不是表示日期的有效方式,因为该字段是日期类型。
看看它告诉的消息
time: Cast to Date failed for value
时间和日期是不同的东西
如果你需要用到下面作品的时间也一样
{
"time":"2019-06-12T13:34:00.000"
}
可以创建自定义类型和存储时间。但我建议您将时间存储为字符串。在这种情况下,字符串很容易解析、维护和检索。
像这样添加自定义验证。
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']
}
我有如下模式对象
schedule: [{
time: {
type: Date,
required: true
}
}]
当我尝试将 post 中的数据 post 作为
"schedule":[
{
"time":"18:00:00"
}]
我遇到以下错误
validation failed: schedule.1.time: Cast to Date failed for value "12:00:00"
如果我将 type
定义为 String
,一切正常。
我认为我定义接受时间的类型是错误的。谁能帮我更好地定义对象类型
如您所见,您定义的字段类型与您要在其中存储的数据不匹配。如果您将其定义为类型:日期,它将只接受有效日期,而“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;
}
我有一个简单的问题要问你,你想只存储 时间(没有日期部分,例如 18:00:00) 或作为 时间戳 (日期和时间,例如 2019-06-11T06:24:46.642Z)?
如果只是时间,那么不幸的是你不能将它存储在 date
类型字段中,因为它接受日期或时间戳,而 string
类型可以接受任意字符串。
我建议将 18:00:00
存储为 string
,然后在检索后以您想要的方式进行处理,或者存储字段类型为 date
的 timestamp
并使用它及其相应的日期。
只是为了解释错误,这是因为 18:00:00
不是表示日期的有效方式,因为该字段是日期类型。
看看它告诉的消息
time: Cast to Date failed for value
时间和日期是不同的东西
如果你需要用到下面作品的时间也一样
{
"time":"2019-06-12T13:34:00.000"
}
可以创建自定义类型和存储时间。但我建议您将时间存储为字符串。在这种情况下,字符串很容易解析、维护和检索。
像这样添加自定义验证。
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']
}