我正在构建一个 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);
}
由于所有属性都是必需的,因此当我想使用具有相同属性但全部可选的模式时,我必须硬编码另一个所有属性都是可选的模式。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'}));
如果您已经有一个需要部分或全部键的架构,则使用 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());
| 归档时间: | 
 | 
| 查看次数: | 3398 次 | 
| 最近记录: |