如何在Ajv中添加关键字Nullable(或allowNull)?

11

我写了下面的代码。

var ajv = new require('ajv');

ajv.addKeyword('allowNull', {
    type: 'null',
    metaSchema: {
        type: 'boolean'
    },
    compile: function(allowNullEnable, parentSchema) {
        return function(data, dataPath, parentData) {
            if (allowNullEnable) {
                return true;
            } else {
                if (parentSchema.type == 'null') {
                    return true;
                } else {
                    return data === null ? false : true;
                }
            }
        }
    }
});

var schema = {
  type: "object",
  properties: {
    file: {
      type: "string",
      allowNull: true
    }
  }
};

var data = {
   file: null
};

console.log(ajv.validate(schema, data)) // Expected true

但是它并不起作用。如何编写这样的验证器?

即使编译函数总是返回true,它仍然无法通过验证。

可以在Node沙盒中测试代码: https://runkit.com/khusamov/59965aea14454f0012d7fec0

1个回答

23

你不能覆盖 type 关键字。在 JSON 中,null 是一种单独的数据类型,因此您需要在模式中使用 "type": ["string", "null"],无需使用自定义关键字。


我需要为Swagger格式创建两个关键字,例如nullable和descriminator。因此,我需要以关键字的形式呈现。方案不能更改。 - Khusamov Sukhrob
可以通过使用inline关键字来完成,但是这需要比较复杂的操作。请参见https://github.com/epoberezkin/ajv/issues/486 - esp
我已经阅读了这个问题。如果我理解正确,目前没有解决方案,也不会有吗? - Khusamov Sukhrob
可以使用inline关键字来完成,但只能在allErrors: true模式下工作。您无法更改类型验证过程,但可以像ajv-errors一样分析和修改收集到的错误,因此如果类型验证失败但数据为null且nullable:true,则会删除该错误。 - esp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接