我正在尝试使用Joi来验证RESTful Web服务接受的数据模型。
对于创建操作,我想对字段强制执行“必需”验证。但是,对于更新操作,可能会提交部分数据对象,因此我希望忽略“required”属性。
除了创建两个模式之外,还有办法实现这个目标吗?
答案 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)