如何使用 Joi 最新版本验证枚举字符串?

Rar*_*rio 7 javascript node.js express typescript

如何验证枚举字符串?

我曾经按照这里的建议使用此方法:https : //github.com/hapijs/joi/issues/1449

enum UserRole {
  Admin = 'admin',
  Staff = 'staff'
}

const validator = {
  create: Joi.object().keys({
    first_name: Joi.string().min(1),
    last_name: Joi.string()
      .min(1)
      .required(),
    password: Joi.string()
      .regex(/^[\x20-\x7E]+$/)
      .min(8)
      .max(72)
      .required(),
    role: Joi.string()
      .valid([UserRole.Admin, UserRole.Staff])
      .optional(),
    is_active: Joi.boolean().optional()
  })
};
Run Code Online (Sandbox Code Playgroud)

但现在 , Error: Method no longer accepts array arguments: valid

Sul*_*Sah 14

我可以像这样使用 Joi.any().valid() 让它工作,希望对你有用。

const Joi = require("@hapi/joi");

const roles = ["admin", "staff"];

const schema = Joi.object({
  first_name: Joi.string().min(1),
  last_name: Joi.string()
    .min(1)
    .required(),
  password: Joi.string()
    .regex(/^[\x20-\x7E]+$/)
    .min(8)
    .max(72)
    .required(),
  role: Joi.any().valid(...roles),
  is_active: Joi.boolean().optional()
});
Run Code Online (Sandbox Code Playgroud)

例子:

使用有效角色时没有错误。

const { error, value } = schema.validate({
  first_name: "Magnus",
  last_name: "Carlsen",
  password: "chess/1234",
  role: "staff"
});

console.log(error); //undefined
Run Code Online (Sandbox Code Playgroud)

当没有使用角色时没有错误。

const { error, value } = schema.validate({
  first_name: "Magnus",
  last_name: "Carlsen",
  password: "chess/1234"
});

console.log(error); //undefined
Run Code Online (Sandbox Code Playgroud)

当使用不同的角色时,它会给出验证错误。

const { error, value } = schema.validate({
  first_name: "Magnus",
  last_name: "Carlsen",
  password: "chess/1234",
  role: "unknown"
});

console.log(error); // Error [ValidationError]: "role" must be one of [admin, staff]...

Run Code Online (Sandbox Code Playgroud)

  • `valid(User.Admin, User.Staff)` 与 `valid(...roles)` 相同,其中 `roles=[User.Admin, User.Staff]`。这意味着@SuleymanSah 的答案是正确的。您可以接受它作为正确答案 (2认同)