嵌套对象的猫鼬验证

时间:2018-07-16 11:26:28

标签: mongodb mongoose

场景::具有REST API且具有ExerciseAnswer模式的简单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的初学者。任何帮助将不胜感激。

0 个答案:

没有答案