如何使用自定义消息设置 Joi 验证?

时间:2021-01-30 07:36:59

标签: node.js joi

我试图在 Joi 中使用一些自定义消息设置一些验证。因此,例如,我发现当一个字符串必须至少有 3 个字符时,我们可以使用“string.min”键并将其与自定义消息相关联。示例:

  username: Joi.string().alphanum().min(3).max(16).required().messages({
    "string.base": `Username should be a type of 'text'.`,
    "string.empty": `Username cannot be an empty field.`,
    "string.min": `Username should have a minimum length of 3.`,
    "any.required": `Username is a required field.`,
  }),

现在我的问题是:

问题

// Code for question
  repeat_password: Joi.ref("password").messages({
    "string.questionHere": "Passwords must match each other...",
  }),

什么方法 (questionHere) 名称需要设置为 repeat_password 才能通知用户密码必须匹配?我什至不知道 Join.ref("something") 是否接受 .messages({...})...

如果有人可以在 Joi 文档中向我展示一些帮助,我还没有在那里找到任何东西...

1 个答案:

答案 0 :(得分:2)

您在此处试图找到的是错误 type。可以在 joi validate 函数返回的错误对象中找到。例如:error.details[0].type 会给你你想要的东西。

关于您的第二个问题,Join.ref("something") 不接受 .messages({...})。在这里,您可以将 validref 结合使用。

例如:

const Joi = require('joi');

const schema = Joi.object({
        username: Joi.string().alphanum().min(3).max(16).required().messages({
            "string.base": `Username should be a type of 'text'.`,
            "string.empty": `Username cannot be an empty field.`,
            "string.min": `Username should have a minimum length of 3.`,
            "any.required": `Username is a required field.`,
          }),
          password: Joi.string().required(),
          password_repeat: Joi.any().valid(Joi.ref('password')).required().messages({
            "any.only" : "Password must match"
          })
});

const result = schema.validate({ username: 'abc', password: 'pass', password_repeat: 'pass1'});


// In this example result.error.details[0].type is "any.only"