【问题标题】:How to validate Enum String with Joi latest version?如何使用 Joi 最新版本验证枚举字符串?
【发布时间】:2020-02-17 13:59:51
【问题描述】:

如何验证枚举字符串?

我曾经按照这里的建议进行此操作: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()
  })
};

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

【问题讨论】:

  • 嗯,它在changelog 中:“不再接受数组参数。必须将每个值作为单独的参数传递。” .valid(UserRole.Admin, UserRole.Staff)

标签: javascript node.js typescript express


【解决方案1】:

我可以像这样使用 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()
});

例子:

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

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

console.log(error); //undefined

不使用角色时不会出错。

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

console.log(error); //undefined

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

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]...

【讨论】:

  • 嗨@SuleymanSah,抱歉回复晚了。你的回答也有效。但是根据提到的 Joi 更改日志 @altocumulus,我选择了 role: Joi.string().valid(User.Admin, User.Staff)。谢谢!
  • valid(User.Admin, User.Staff)valid(...roles)roles=[User.Admin, User.Staff] 相同。这意味着@SuleymanSah 的回答是正确的。你可以接受它作为正确答案
  • 不是真的,因为如果你在 typescript 中将它声明为 enum 你不能像你说的那样传播它,它目前不起作用,@ 987654329@ 是枚举的平均数组。原题使用了这种格式:enum UserRole { Admin = 'admin', Staff = 'staff' } 当然,最好只使用valid(Enum),但是不支持这个API。
【解决方案2】:
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) // do not use an array
      .optional(),
    is_active: Joi.boolean().optional()
  })
};

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2017-01-29
    • 2022-01-08
    • 2021-05-20
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多