首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Node.js + Joi如何显示自定义错误消息?

Node.js + Joi如何显示自定义错误消息?
EN

Stack Overflow用户
提问于 2018-02-10 20:48:33
回答 12查看 85.3K关注 0票数 51

在Node.js RESTapi中验证用户输入似乎非常简单

..。

但问题是,我的应用程序不是用英语编写的。这意味着我需要向前端用户发送一条自定义的书面消息。

我已经在谷歌上搜索过了,只发现了问题。

也许有人能给出一个解决方案?

这是我用来验证

系统:

代码语言:javascript
代码运行次数:0
运行
复制
var schema = Joi.object().keys({
      firstName: Joi.string().min(5).max(10).required(),
      lastName: Joi.string().min(5).max(10).required()
      ..
    });

    Joi.validate(req.body, schema, function(err, value) {
      if (err) {
        return catched(err.details); 
      }
    });

    function catched(reject) {
      res.json({
        validData: false,
        errors: reject
      });
    }

另外,有没有办法使用

在客户端?

谢谢!

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2018-02-11 04:07:11

我找到的一个解决方案是设置:

代码语言:javascript
代码运行次数:0
运行
复制
var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().label("Your error message in here"),
  lastName: Joi.string().min(5).max(10).required()
  ..
});

然后打印

从回调

变量

票数 23
EN

Stack Overflow用户

发布于 2019-10-04 18:05:51

原始答案

当前的方法(我个人认为它更好)是使用

(或

)。

代码语言:javascript
代码运行次数:0
运行
复制
const Joi = require('@hapi/joi');

const joiSchema = Joi.object({
  a: Joi.string()
    .min(2)
    .max(10)
    .required()
    .messages({
      'string.base': `"a" should be a type of 'text'`,
      'string.empty': `"a" cannot be an empty field`,
      'string.min': `"a" should have a minimum length of {#limit}`,
      'any.required': `"a" is a required field`
    })
});

const validationResult = joiSchema.validate({ a: 2 }, { abortEarly: false });
console.log(validationResult.error); // expecting ValidationError: "a" should be a type of 'text'

使用

不推荐

只是为了用自定义消息更新默认消息。

是提供更多选项作为首选项的一种精心设计的方法。首选项的其他选项直接取自

.validate()

进一步阅读:

https://github.com/hapijs/joi/issues/2158

更新1

:我看到上面的解释对一些人不起作用,所以我放了一些代码来测试一下自己。点击此处查看:

https://runkit.com/embed/fnfaq3j0z9l2

我还更新了之前共享的代码片段,以获得从包包含、使用到调用实际验证方法的详细信息。

更新2

:joi错误类型及其描述的列表(对于

-如string.base、array.unique、date.min等。)是可用的

这里

..。

更新3

:Joi有

从hapi项目迁移

要独立执行以下操作:

https://www.npmjs.com/package/joi

..。确保您使用的是最新版本(或至少更高版本的v17)。

票数 68
EN

Stack Overflow用户

发布于 2019-02-13 03:50:25

扩展

Ashish Kadam的回答

,如果您有许多不同的错误类型,您可以检查存在哪种类型的错误,并相应地设置其消息:

Joi v17.4.0

v17.4.0使用

代码语言:javascript
代码运行次数:0
运行
复制
var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(errors => {
    errors.forEach(err => {
      switch (err.code) {
        case "any.empty":
          err.message = "Value should not be empty!";
          break;
        case "string.min":
          err.message = `Value should have at least ${err.local.limit} characters!`;
          break;
        case "string.max":
          err.message = `Value should have at most ${err.local.limit} characters!`;
          break;
        default:
          break;
      }
    });
    return errors;
  }),
  // ...
});

您可以在此处查看错误列表:

Joi 17.4.0 API参考>错误>错误列表

Joi v14.3.1

v14.3.1使用

代码语言:javascript
代码运行次数:0
运行
复制
var schema = Joi.object().keys({
  firstName: Joi.string().min(5).max(10).required().error(errors => {
    errors.forEach(err => {
      switch (err.type) {
        case "any.empty":
          err.message = "Value should not be empty!";
          break;
        case "string.min":
          err.message = `Value should have at least ${err.context.limit} characters!`;
          break;
        case "string.max":
          err.message = `Value should have at most ${err.context.limit} characters!`;
          break;
        default:
          break;
      }
    });
    return errors;
  }),
  // ...
});

您可以在此处查看错误列表:

Joi 14.3.1 API参考>错误>错误列表

此外,您还可以查看

有关详细信息,请参阅。引用文档:

如果规则失败,则使用自定义错误覆盖默认的joi错误:

可以是:

的实例

-覆盖错误。

A

,将错误数组作为参数,其中必须:

返回

-用此文本替换错误消息

返回单个

或者是一个

其中:

-提供错误类型的可选参数(例如

)。

-可选参数if

,其中包含错误的文本。

-可选参数if

包含一个模板字符串,使用与通常的joi语言错误相同的格式。

-可选参数,用于在使用

..。

代码语言:javascript
代码运行次数:0
运行
复制
- return an `Error` - same as when you directly provide an `Error`, but you can customize the error message based on the errors.

-布尔值,指示错误处理程序应用于所有错误还是仅用于此属性上发生的错误(

值)。这个概念只有在以下情况下才有意义

或者

与其他值一样,模式没有子级。默认为

..。

票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48720942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档