Node.js üstünde AJV'de harici referansları olan ".json" uzantılı şemaların yüklenmesini birazcık anlatayım. Kodları test etmeden yazıyorum asıl olan temelde neyin döndüğüdür.
Ana şemamız index.json ve içinde harici referans olarak test.json'ı içersin (bkz. definitons -> "TW": {"$ref": "http://localhost:3000/schema/providers/login/test.json"}
{
"id": "http://localhost:3000/schema/providers/login/index",
"title": "Providers",
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "Kullanıcı Giriş Sağlayıcıları",
"type": "object",
"definitions": {
"TW": {"$ref": "http://localhost:3000/schema/providers/login/test.json"}
},
"additionalProperties": false,
"properties": {
"TW": {"$ref": "#/definitions/TW"}
}
}
test.json
{
"id": "http://localhost:3000/schema/providers/login/test.json",
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"id": {
"type": "integer",
"default": 0
},
"id_str": {"type": "string"},
"name": {
"type": "string",
"default": ""
}
},
"required": [
"id",
"name"
]
}
Her iki şemanın ID'sinin, URL adresleri olduğuna dikkat! Çünkü bu sayede hem eşsizliği sağlamış olursunuz hem de bağlantılarını kopartmamış olursunuz. Ayrıca $ref kısmını definitions içinde veriyor ve properties içindeki özelliklere buradan verdiğimiz için aynı tipi başka bir yerde kullansakta bir kez http talebi yapmış olacağız (Örn. properties:{ ev_adresi:{$ref:'http:/..../adres.json'}, is_adresi:{$ref:'http:/..../adres.json'}, ..} olsaydı aynı json 2 kez çağrılmış olacaktı).
addSchema metodu
2 Parametre alıyor; ilki şemanın kendisi(json nesnesi olacak), ikincisi ise eğer şemanın içinde "id" tanımlanmamışsa kullanılması için sizin belirteceğiniz "id" değeri(string olacak).
var Ajv = require('ajv'),
ajv = Ajv({removeAdditional:true});
function addSchema() {
var schTest = require('./providers/login/test.json');
var schIndex = require('./providers/login/index.json');
ajv.addSchema(schTest);
ajv.addSchema(schIndex);
var bValid = ajv.validate(schIndex.id, {TW: {id: 2, a: 1, name: "cem"}});
if (!bValid) {
console.log("Hatalıysam ara: ");
console.log(ajv.errors);
}else{
console.log("Herkül müsün kardeşim:");
var sch2 = ajv.getSchema("http://localhost:3000/schema/providers/login/index");
console.log(sch2.schema);
}
}
addSchema();
compile metodu
var Ajv = require('ajv'),
ajv = Ajv({removeAdditional:true});
function compile() {
var schTest = require('./providers/login/test.json');
var schIndex = require('./providers/login/index.json');
ajv.addSchema(schTest); // önce test şemasını ekleyelimki index.json içinde kullanılmadan önce hazır olsun
var validate = ajv.compile(schIndex); // index.json'ı derleyerek doğrulayacak fonksiyonumuza ulaşalım.
console.log(validate.schema) // şemamızın içinde test.json'ı referans olarak görürüz ama doğrulama sırasında bu referanslara bakarak veri nesnesini doğrulayacaktır
var a = validate({TW: {id: 2, name: "cem"}}) // hata vermez ve başarıyla doğrulanmış olur
if(validate.errors){
console.log(validate.errors)
}else{
console.log(a);
}
}
compile();
compileAsync metodu
Bu fonksiyonu kullanmadan önce asenkron olarak yükleme işini yapacak fonksiyonu tanımlamalısınız ve yükleme tamamlandıktan sonra doğrulama yapacak callback fonksiyonunu girmelisiniz. Bunun için AJV'nin options larından loadSchema'yı kullanacağız.
ajv = Ajv({
loadSchema: function (uri, callback) {
var request = require('request');
request(uri, function (err, res, body) {
console.log(body); // Bu gelen şemayı doğrulamaya göndermeden önce JSON'a çevirmelisiniz.
if (err || res.statusCode >= 400)
callback(err || new Error('Loading error: ' + res.statusCode));
else {
callback(null, JSON.parse(body));
}
});
}
});
function compileAsync() {
var sch = require('./providers/login/index.json');
console.log("sch--------------");
console.log(JSON.stringify(sch));
ajv.compileAsync(sch, function (err, validate) {
console.log(validate); // görelim ne var elimizde
if (err) return; // hata varsa dön bebeğim
var a = validate({TW:{id: 2, name: "cem"}});
console.log(validate.errors); // null döner
console.log(a); // true döner(hatasız);
});
}
compileAsync();
Tüm kod:
var Ajv = require('ajv'),
//sch = require('./index'),
ajv = Ajv({removeAdditional: true}); // options can be passed
ajv = Ajv({
loadSchema: function (uri, callback) {
var request = require('request');
request(uri, function (err, res, body) {
console.log("request ended");
console.log(body);
if (err || res.statusCode >= 400)
callback(err || new Error('Loading error: ' + res.statusCode));
else {
callback(null, JSON.parse(body));
}
});
}
});
function compile() {
var schTest = require('./providers/login/test.json');
var schIndex = require('./providers/login/index.json');
ajv.addSchema(schTest);
var validate = ajv.compile(schIndex);
console.log(validate.schema);
var a = validate({TW: {id: 2, name: "cem"}});
console.log(validate.errors);
console.log(a);
}
//compile();
function compileAsync() {
var sch = require('./providers/login/index.json');
console.log("sch--------------");
console.log(JSON.stringify(sch));
ajv.compileAsync(sch, function (err, validate) {
console.log(validate);
console.log("neredeyim")
console.log("err: " + err);
if (err) return;
var a = validate({id: 2, name: "cem"})
console.log(validate.errors)
console.log(a);
console.log("buradayım");
});
}
//compileAsync();
function addSchema() {
var schTest = require('./providers/login/test.json');
var schIndex = require('./providers/login/index.json');
ajv.addSchema(schTest);
ajv.addSchema(schIndex);
var bValid = ajv.validate(schIndex.id, {a: 1,TW: {id: 2, name: "cem"}});
if (!bValid) {
console.log("Hatalıysam ara: ");
console.log(ajv.errors);
}else{
console.log("Herkül müsün kardeşim:");
var sch2 = ajv.getSchema("http://localhost:3000/schema/providers/login/index");
console.log(sch2.schema);
}
}
//addSchema();