将所有属性标记为必需或非 Joi

2 node.js express joi

我正在构建一个 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)

返回一个新模式,其中列出的每个路径键都已被修改,其中:

  • paths - 键字符串数组、单个键字符串或预分割键字符串数组的数组。键字符串路径使用点。来指示关键层次结构。
  • 调整器 - 使用签名函数(模式)的函数,它必须返回修改后的模式。例如,(schema) => schema.required()。

该方法不会修改原始架构。

前任:


// 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)