我正在构建一个 Express API 并使用 @hapi/joi 进行验证。但是我发现自己处于以下情况:如果我想验证新用户,则架构中的所有属性都必须是必需的,但如果客户端想要修改用户,这些属性必须是可选的,因为只有客户端知道什么它将修改的属性。因此,如果我为新用户提供此架构:
function validateUser(user) {
const schema = Joi.object().keys({
name: Joi.string().required(),
lastName: Joi.string().required(),
email: Joi.string().email().required(),
password: Joi.string().required(),
address: Joi.string().required(),
city: Joi.string().required(),
district: Joi.string().required()
});
return schema.validate(user);
}
Run Code Online (Sandbox Code Playgroud)
由于所有属性都是必需的,因此当我想使用具有相同属性但全部可选的模式时,我必须硬编码另一个所有属性都是可选的模式。Joi 有没有办法或选项来避免冗余代码?就像传递给 validateUser 函数的 isNew 参数以将其应用到架构一样?
sau*_*abh 10
更好的方法是使用any.fork(paths, adjustmenter)。
返回一个新模式,其中列出的每个路径键都已被修改,其中:
该方法不会修改原始架构。
前任:
// define the object
const schemaObj = {
name: Joi.string(),
lastName: Joi.string(),
email: Joi.string().email(),
password: Joi.string(),
address: Joi.string(),
city: Joi.string(),
district: Joi.string()
};
// no need to use fork here every obj is already not required
const allUnreqJoiObj = Joi.object(schemaObj);
// use of fork to modify it
// fork for all keys
const allReqJoiObj = Joi.object(schemaObj).fork(Object.keys(schemaObj), (schema) => schema.required());
console.log(allReqJoiObj.validate({'city': 'some city'}));
// fork for selected keys
const fewReqJoiObj = Joi.object(schemaObj).fork(['email', 'password'], (schema) => schema.required());
console.log(fewReqJoiObj.validate({'city': 'some city'}));
Run Code Online (Sandbox Code Playgroud)
如果您已经有一个需要部分或全部键的架构,则使用 fork 并使它们成为可选
前任:
const schemaObj = {
name: Joi.string().required(),
lastName: Joi.string().required(),
};
const allOptional = Joi.object(schemaObj).fork(Object.keys(schemaObj), (schema) => schema.optional());
const nameOptional = Joi.object(schemaObj).fork(['name'], (schema) => schema.optional());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3398 次 |
| 最近记录: |