忽略Joi验证中的“必需”?

时间:2015-05-21 20:18:51

标签: javascript validation joi

我正在尝试使用Joi来验证RESTful Web服务接受的数据模型。

对于创建操作,我想对字段强制执行“必需”验证。但是,对于更新操作,可能会提交部分数据对象,因此我希望忽略“required”属性。

除了创建两个模式之外,还有办法实现这个目标吗?

5 个答案:

答案 0 :(得分:0)

使用.when()并根据条件设置.required()

答案 1 :(得分:0)

您可以通过使用optionalKeys扩展第一个模式来避免这两种模式。

const createSchema = Joi.object().keys({
  name: Joi.string().required(),
  birthday: Joi.date().required(),
});

const updateSchema = createSchema.optionalKeys("name", "birthday");

Joi.validate({name: "doesn't work"}, createSchema); // error: birthday field missing
Joi.validate({name: "it works"}, updateSchema); // all good

答案 2 :(得分:0)

使用.fork(),您可以传递想要的字段数组。

const validate = (credentials, requiredFields = []) => {

  // Schema
  let userSchema = Joi.object({
    username: Joi.string(),
    email: Joi.string().email(),
  })

  // This is where the required fields are set
  userSchema = userSchema.fork(requiredFields, field => field.required())

  return userSchema.validate(credentials)
}

validate(credentials, ['email'])

或者相反,将其更改为可选。

答案 3 :(得分:0)

您可以通过将Joi.string()...替换为您作为用户名传递的确切值来跳过Joi验证。在示例中,我将空用户名传递给api。

还可以根据条件跳过joi验证

let userSchema = Joi.object({
   username: "",
   email: <some condition> === true ? "" : Joi.string().required()
})

答案 4 :(得分:0)

使用 alter 方法可以实现您想要的结果。这是一个例子。

const validateUser = (user, requestType) => {
  let schema = Joi.object({
    email: Joi.string().email().required(),
//Here, we want to require password when request is POST. 
//Also we want to remove password field when request is PUT
    password: Joi.string()
      .min(1)
      .max(256)
      .alter({
//For POST request
        post: (schema) => schema.required(),
//For PUT request
        put: (schema) => schema.forbidden(),
      }),
  });

  return schema.tailor(requestType).validate(user);
};

然后在我们的路由中调用函数并传递参数,如下所示:

//For POST
const { error } = validateUser({email: "me@mail.com"}, "post");//error: "password is a required field" 
//For PUT 
const { error } = validateUser({email: "me@mail.com"}, "put");//error: undefined (no error)