场景::具有REST API且具有Exercise
和Answer
模式的简单Quiz类型应用程序。我需要保存用户的尝试。尝试次数决定保持在应用程序级别,并且在成功尝试后,会发出API请求以将所有尝试保存在一起。
我很难处理子文档的验证。
我要实现的目标:我要验证(必填:true)JSON输入的每个键/值对。
以下是我的Answer
模型:
var mongoose = require('mongoose');
var attemptsSchema = new mongoose.Schema({
attempt_no: {
type: Number,
required: true
},
attempt_outcome: {
type: String,
required: true
}
});
var AnswerSchema = new mongoose.Schema({
exercise_id: {
type: mongoose.Schema.Types.ObjectId,
ref: "Exercise",
required: [true, "This field is required"]
},
main: {
type: [attemptsSchema],
required: true
}
}, {
timestamps: true
});
exports.Answer = mongoose.model('Answer', AnswerSchema);
来自应用程序的JSON输入将是这样的。 (请注意 man 键,该键应为 main )
{
"exercise_id": "5b4890a08f1073133c16bcb8",
"man": [
{
"attempt_no": 1,
"attempt_outcome": "incorrect"
},
{
"attempt_no": 2,
"attempt_outcome": "Correct"
}
]
}
因此,首先,我想检查键(路径):main
是否存在。如果存在,请检查进一步的验证,即检查attempt_no
是否为Number
类型并存在,attempt_count
是否为String
类型并存在等等。
使用上述配置,如果我尝试运行此代码,则不会收到任何验证错误。
但是,如果我稍微更改了架构,即(我删除了该类型的数组分配):
main: {
type: attemptsSchema,
required: true
}
然后我得到以下验证错误
Answer validation failed: main: Path `main` is required.
现在,如果我在输入中进行了一些更改,例如:((attempt_no:传递了一个字符串而不是数字
{
"exercise_id": "5b4890a08f1073133c16bcb8",
"main": [
{
"attempt_no": "asdasd",
"attempt_outcome": "incorrect"
},
{
"attempt_no": "asdasd",
"attempt_outcome": "Correct"
}
]
}
我收到以下消息
Answer validation failed: main.attempt_outcome: Path `attempt_outcome` is required., main.attempt_no: Path `attempt_no` is required., main: Validation failed: attemp
t_outcome: Path `attempt_outcome` is required., attempt_no: Path `attempt_no` is required.
我知道,发送尝试数组现在已经没有意义,但是我仍然需要发送尝试并接收数组每个元素的验证消息。要实现此目标,应在模型上进行适当的对应配置是什么?
我在这里想念什么?我是Mongo / Mongoose的初学者。任何帮助将不胜感激。