首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Joi.forbidden()等价于猫鼬

Joi.forbidden()等价于猫鼬
EN

Stack Overflow用户
提问于 2019-12-25 02:19:13
回答 1查看 1.5K关注 0票数 2

下面的模式允许我将optionalField设置为option1,但是如果将值设置为option2,则optionalField可以设置为用户想要的任何东西。相反,如果value设置为option1以外的任何东西,并且optionalField被传入,我希望验证失败。

代码语言:javascript
复制
const validValues = ['option1', 'option2']

const sampleSchema = new mongoose.Schema({
    value: {
        type: String,
        enum: validValues,
        required: true
    }   

    optionalField: {
        type: Number,
        required: function() { return this.value === 'option1' }
        // validation should fail if this property is passed in when value is anything but option1
    }
})

Joi有一个很好的方法可以使用Joi.forbidden()来实现这一点。

代码语言:javascript
复制
const validValues = ['option1', 'option2']

const schema = Joi.object({
    value: Joi.string().valid(...validValues).required(),
    optionalField: Joi.string().when('value', { is: 'option1', then: Joi.required() otherwise: Joi.forbidden() })
})

如果我使用此模式进行验证,并将optionalField传递给Joi,除非valueoption1,否则验证将失败。

我希望能在猫鼬身上找到一种方法来实现同样的目标。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-25 08:13:46

您可以这样使用自定义验证器

代码语言:javascript
复制
  optionalField: {
    type: Number,
    required: function() {
      return this.value === "option1";
    },
    validate: {
      validator: function(v) {
        console.log({ v });
        return !(this.value !== "option1" && v.toString());
      },
      message: props =>
        `${props.value} optionalField is forbidden when value is not option1`
    }
  }

样本路线:

代码语言:javascript
复制
router.post("/sample", (req, res) => {
  const sample = new Sample(req.body);

  sample
    .save()
    .then(doc => res.send(doc))
    .catch(err => res.status(500).send(err));
});

投入1:

代码语言:javascript
复制
{
    "value": "option2",
    "optionalField": 11
}

结果1:(错误)

代码语言:javascript
复制
{
    "errors": {
        "optionalField": {
            "message": "11 optionalField is forbidden when value is not option1",
            "name": "ValidatorError",
            "properties": {
                "message": "11 optionalField is forbidden when value is not option1",
                "type": "user defined",
                "path": "optionalField",
                "value": 11
            },
            "kind": "user defined",
            "path": "optionalField",
            "value": 11
        }
    },
    "_message": "Sample validation failed",
    "message": "Sample validation failed: optionalField: 11 optionalField is forbidden when value is not option1",
    "name": "ValidationError"
}

投入2:

代码语言:javascript
复制
{
    "value": "option2"
}

成果2:(成功)

代码语言:javascript
复制
{
    "_id": "5e031b473cbc432dfc03fa0e",
    "value": "option2",
    "__v": 0
}

投入3:

代码语言:javascript
复制
{
    "value": "option1"
}

结果3:(错误)

代码语言:javascript
复制
{
    "errors": {
        "optionalField": {
            "message": "Path `optionalField` is required.",
            "name": "ValidatorError",
            "properties": {
                "message": "Path `optionalField` is required.",
                "type": "required",
                "path": "optionalField"
            },
            "kind": "required",
            "path": "optionalField"
        }
    },
    "_message": "Sample validation failed",
    "message": "Sample validation failed: optionalField: Path `optionalField` is required.",
    "name": "ValidationError"
}

投入4:

代码语言:javascript
复制
{
    "value": "option1",
    "optionalField": 11
}

成果4:(成功)

代码语言:javascript
复制
{
    "_id": "5e031ba83cbc432dfc03fa10",
    "value": "option1",
    "optionalField": 11,
    "__v": 0
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59474717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档