9

我需要在我的 NodeJS 应用程序中验证一些对象。我已经使用了一个很棒的库express-validator,它工作得很好,但是现在我需要验证不同的对象,不仅是请求,而且就 express 验证器利用validator库而言,它又不支持字符串类型以外的类型。

我发现了不同的变体,比如JsonschemaAjv

它们提供了很棒的功能,但我需要能够设置错误消息,而不仅仅是捕获异常或从返回对象中解析它。像那样

 var schema = {
    "id": "/SimplePerson",
    "type": "object",
    "properties": {
      "name": {"type": "string", "error": "A name should be provided"},
      "address": {"$ref": "/SimpleAddress"},
      "votes": {"type": "integer", "minimum": 1}
    }
  };

所以我可以为每个属性设置错误消息。

是否有任何现有的解决方案来实现此功能?

可能的解决方案

我找到了一个很棒的库JSEN,它提供了必要的功能。

4

5 回答 5

5

一种解决方案是使用 Joi 库: https ://github.com/hapijs/joi

该库维护良好,使用良好,并提供了很多灵活性和可能的​​操作。

例子 :

const Joi = require('joi');

const schema = Joi.object().keys({
    name: Joi.string().error(new Error('A name should be provided')),
    address: Joi.ref('$SimpleAddress'),
    votes: Joi.number().min(1),
});

// Return result.
const result = Joi.validate(yourObject, schema);
于 2017-06-25T20:30:16.947 回答
3

可用于 JSON 验证的三个强大且流行的库是

AJV: https ://github.com/epoberezkin/ajv

JOI: https ://github.com/hapijs/joi

JSON 验证器: https ://github.com/tdegrunt/jsonschema

所有这些库都允许您验证不同的数据类型、进行条件验证以及设置自定义错误消息。

于 2020-03-15T22:00:13.653 回答
1

我使用Json 模式验证器

 npm install jpv --save

用法

  const jpv = require('jpv');

  // your json object
  var json = {
      status: "OK",
      id: 123,
      type: {}
  }

  // validation pattern
  var pattern = {
      status: /OK/i,
      id: '(number)',
      type: '(object)'
  };

  var result = jpv.validate( json , pattern)
于 2018-03-29T20:43:09.850 回答
1

您还可以尝试nonvalid,这是一个支持基于回调的验证以及自定义检查和错误的库(免责声明:它是由我编写的)。

于 2019-12-25T14:04:19.633 回答
1

我即将着手验证向我的 Web 服务提交的 JSON,并将使用tcomb-validation。它是 JSON 模式的轻量级替代方案,基于类型组合器。

“交叉点”示例:

var t = require('tcomb-validation');
var Min = t.refinement(t.String, function (s) { return s.length > 2; }, 'Min');
var Max = t.refinement(t.String, function (s) { return s.length < 5; }, 'Max');
var MinMax = t.intersection([Min, Max], 'MinMax');

MinMax.is('abc'); // => true
MinMax.is('a'); // => false
MinMax.is('abcde'); // => false
于 2020-03-15T21:52:06.780 回答