【问题标题】:Joi validate ignores nested keysJoi 验证忽略嵌套键
【发布时间】:2019-03-23 07:36:11
【问题描述】:

这是我的 Joi 验证:

let schema = Joi.object().keys({
  personal_info: Joi.object().keys({
    first_name: Joi.string().min(2).max(10).regex(Regex.alphabeta, 'alphabeta').required().error(JoiCustomErrors),
    last_name: Joi.string().min(2).max(10).regex(Regex.alphabeta, 'alphabeta').required().error(JoiCustomErrors),
    phone: Joi.string().min(10).max(10).regex(Regex.num, 'num').required().error(JoiCustomErrors),
    nickname: Joi.string().min(3).max(12).regex(Regex.alphanum, 'alphanum').required().error(JoiCustomErrors),
    birthday: Joi.date().max(`01-01-${new Date().getFullYear()-8}`).required().error(JoiCustomErrors),
    IDNumber: Joi.string().min(9).max(9).regex(Regex.num, 'num').required().error(JoiCustomErrors),
    address: Joi.object().keys({
      city: Joi.string().valid(Cities).required().error(JoiCustomErrors),
      street: Joi.string().min(2).max(15).regex(Regex.alphabeta, 'alphabeta').required().error(JoiCustomErrors),
      house_number: Joi.string().min(1).max(5).regex(Regex.alphanum, 'alphanum').error(JoiCustomErrors)
    })
  }),
  permission_level: Joi.number().min(1).max(9).required().error(JoiCustomErrors)
});
Joi.validate(req.body, schema, { abortEarly: false }, (err) => {
  if (err) return cast.joiError(err);
  return create_employee(result);
});

说明:

personal_info 对象内的所有嵌套键都不会被检查。这意味着 - 如果我将 first_name 放在父级上(不在 personal_info 下),它会被模式验证器检查 - 应该是这样。

我做错了什么?

【问题讨论】:

  • 问题不清楚,能不能用例子来描述一下。
  • personal_info 下的所有嵌套键都不会被检查。这意味着 - 如果我将 first_name 放在父级(不在 personal_info 下),它会被模式验证器检查。

标签: javascript node.js validation schema joi


【解决方案1】:

在personal_info 模式对象上使用.required(),然后它将按您的预期工作,

'use strict';
const Joi = require('joi');
let schema = Joi.object().keys({
    personal_info: Joi.object().keys({
        first_name: Joi.string().min(2).max(10).required(),
        last_name: Joi.string().min(2).max(10).required()
    }).required(),
    permission_level: Joi.number().min(1).max(9).required()
});
const req = {
    personal_info: {
        first_name: 'AAAA',
        last_name: 'CCCCCC'
    },
    permission_level: 2
};

Joi.validate(req, schema, (err) => {
    console.log(err);
});

【讨论】:

  • 问题是在您的输入中您提供了personal_info 对象。但是,即使输入完全缺少对象,我也需要模式进行测试
  • 尝试从我的输入中删除字段姓氏,它会出错。
  • 更新了答案,现在检查一下,你应该在personal_info键上使用.required()。
  • 是的,这就是诀窍——我也忘记将.required() 添加到对象本身。顺便说一句 - 为了触发所需的你必须首先给对象一个默认值,所以你必须设置:.default({}).required() 以及 - 请添加这个,这样你的答案就是正确的答案
  • .default({}) 不需要触发验证。
猜你喜欢
  • 2020-05-04
  • 1970-01-01
  • 2015-08-03
  • 2020-06-04
  • 2018-02-27
  • 1970-01-01
  • 2020-06-01
  • 2022-08-18
  • 2019-04-14
相关资源
最近更新 更多