我正在使用AJV验证我的JSON模式。目前,该模式是从模块“必需”的,并通过AJV实例进行编译。我正在添加自定义验证器(AJV语音中的自定义关键字)以验证英国的手机号码。我的文件如下所示:
main-service.js
const Ajv = require('ajv');
const AjvErrors = require('ajv-errors');
const templates = require('./templates');
const ajv = new Ajv({
allErrors: true,jsonPointers: true,format: 'full',coerceTypes: true
});
AjvErrors(ajv);
ajv.addFormat('x-mobilePhoneNumber',mobilePhoneNumber => {
return isValidmobilePhoneNumber(mobilePhoneNumber);
});
function someFunc(){
const answers = {key: "answer"};
const schema = templates['some-name'](id)
const validate = ajv.compile(schema);
const valid = validate(answers);
*** Do some stuff with this ***
};
function isValidmobilePhoneNumber(number) {
*** code to validate a phone number ***
};
templates.js
const template = require('q-templates-application'); // this returns the JSON-Schema object.
module.exports = {
'some-name': id => {
template.id = id;
return template;
}
一旦需要“模板”,它将包含一个将使用mobilePhoneNumber
关键字的JSON-Schema对象。此实现按预期工作并验证。但是,我遇到的问题是,它依赖于将自定义验证器硬编码到我的主要服务中。
基本上,我希望将自定义验证代码(在这种情况下,用于手机号码,以及以后选择添加的任何其他验证器)与模板一起返回,从而使我可以将任何自定义验证附加到模板,而不必每个都进行硬编码。
我不确定如何做到这一点,甚至是可能的。我一直在尝试实现以下内容:
-
main-service
启动AJV
template.js文件中需要 -
template
-
const template = require('q-templates-application')
导入一个函数而不是json-schema对象 - 函数检查架构中是否存在其他关键字,或者自定义关键字单独列出
-
- 如果是,则函数执行
ajv.addFormat
命令
- 如果是,则函数执行
-
- 如果不是...那不是!
- 函数返回JSON模式对象
我正在努力寻找一种合适的方法来表述上述内容,因此,请将所有可能的解决方案,无论是部分解决方案,还是全部解决方案,都应感谢!