Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否有JS智能json模式验证器,比如Joi,但有动态自定义错误?_Javascript_Node.js_Validation_Schema_Joi - Fatal编程技术网

Javascript 是否有JS智能json模式验证器,比如Joi,但有动态自定义错误?

Javascript 是否有JS智能json模式验证器,比如Joi,但有动态自定义错误?,javascript,node.js,validation,schema,joi,Javascript,Node.js,Validation,Schema,Joi,我想轻松验证用户的输入 例如,当我询问用户的名字时,可能需要大量的代码才能使其真正有效 我想要在前端和后端都可以使用的东西,而无需更改验证结构 我需要抛出自定义详细错误的能力,类似于: let schema = Joi.object.keys({ first_name: Joi.string("Required to be a string") .noNumbers("Should not contain numbers") .minlenth(2, "At least 2 char

我想轻松验证用户的输入

例如,当我询问用户的名字时,可能需要大量的代码才能使其真正有效

我想要在前端和后端都可以使用的东西,而无需更改验证结构

我需要抛出自定义详细错误的能力,类似于:

let schema = Joi.object.keys({
  first_name: Joi.string("Required to be a string")
  .noNumbers("Should not contain numbers")
  .minlenth(2, "At least 2 chars")
  .maxlength(10, "Maximum 10 chars")
  .required("Required field"),
  last_name: Joi.string("Required to be a string")
  .noNumbers("Should not contain numbers")
  .minlenth(2, "At least 2 chars")
  .maxlength(10, "Maximum 10 chars")
  .required("Required field"),
});
不幸的是,上述方法不起作用——因为Joi不是这样工作的


也许有一个好的JSON模式验证器可以轻松有效地验证用户的输入,而不浪费时间,同时让用户清楚地看到它?

您可以使用JOI。在以下示例中,我将直接覆盖错误:

   return Joi.object()
      .keys({
        str: Joi.string()
          .min(2)
          .max(10)
          .required()
          .error(errors => errors.map((err) => {
            const customMessage = ({
              'string.min': 'override min',
              'string.max': 'override max',
            })[err.type];

            if (customMessage) err.message = customMessage;

            return err;
          })),
      });

我建议您使用函数,因为所有请求的错误消息都是相同的:

function customErrors(errors) {
   return errors.map((err) => {
        const customMessage = ({
             'string.min': 'override min',
             'string.max': 'override max',
        })[err.type];

        if (customMessage) err.message = customMessage;

       return err;
   });
}

return Joi.object()
    .keys({
      str: Joi.string()
           .min(2)
           .max(10)
           .required()
           .error(customErrors),
      });

编辑:

// This

const customMessage = ({
  'string.min': 'override min',
  'string.max': 'override max',
})[err.type];

if (customMessage) err.message = customMessage;


// Equals this

let customMessage = false;

if (err.type === 'string.min') customMessage = 'override min';
if (err.type === 'string.max') customMessage = 'override max';

if (customMessage) err.message = customMessage;


// Equals this

if (err.type === 'string.min') err.message = 'override min';
if (err.type === 'string.max') err.message = 'override max';

到目前为止,这是一个非常棒的答案。我会试试,让你知道。在哪里可以找到
上下文
键的完整参考?我所有的文档都是
customMessage
变量使用ES6功能实现简单快速的
if语句
replacer?如果那么-它是如何命名的?