2011-11-18 18 views
32

Estoy tratando de validar mi API JSON utilizando node.js + json-schema.js de commonjs-utils. La validación única fue fácil, pero no se pudo encontrar la forma correcta de administrar los archivos de esquemas múltiples para permitir la referencia entre sí.¿Cómo administrar múltiples archivos de esquema JSON?

Supongamos que tengo dos modelos & dos API.

// book 
{ 
    "type": "object", 
    "properties": { 
     "title": { "type": "string" }, 
     "author": { "type": "string" } 
    } 
} 
// author 
{ 
    "type": "object", 
    "properties": { 
     "first_name": { "type": "string" }, 
     "last_name": { "type": "string" } 
    } 
} 
// authors API 
{ 
    "type": "array", 
    "items": { "$ref": "author" } 
} 
// books API: list of books written by same author 
{ 
    "type": "object", 
    "properties": { 
    "author": { "$ref": "author" } 
    "books": { "type": "array", "items": { "$ref": "book" } } 
    } 
} 

¿Cada esquema se debe dividir en un archivo separado y estar en línea? ¿O puedo combinar en un solo archivo de esquema como a continuación? Si es posible, ¿cómo puedo hacer referencia al esquema local?

// single schema file { 
    "book": { ... }, 
    "author": { ... }, 
    "authors": { ... }, 
    "books": { ... } } 

Respuesta

46

En JSON esquemas, puede poner un esquema por cada archivo y luego acceder a ellos utilizando su dirección URL (el que estuvieran almacenadas), o un gran esquema con id etiquetas.

Aquí es para un gran archivo:

{ 
    "id": "#root", 
    "properties": { 
     "author": { 
      "id": "#author", 
      "properties": { 
       "first_name": { 
        "type": "string" 
       }, 
       "last_name": { 
        "type": "string" 
       } 
      }, 
      "type": "object" 
     }, 
     // author 
     "author_api": { 
      "id": "#author_api", 
      "items": { 
       "$ref": "author" 
      }, 
      "type": "array" 
     }, 
     // authors API 
     "book": { 
      "id": "#book", 
      "properties": { 
       "author": { 
        "type": "string" 
       }, 
       "title": { 
        "type": "string" 
       } 
      }, 
      "type": "object" 
     }, 
     // books API: list of books written by same author 
     "books_api": { 
      "id": "#books_api", 
      "properties": { 
       "author": { 
        "$ref": "author" 
       }, 
       "books": { 
        "items": { 
         "$ref": "book" 
        }, 
        "type": "array" 
       } 
      }, 
      "type": "object" 
     } 
    } 
} 

continuación Puede hacer referencia a su validador a uno de esos esquemas sub (que se definen con un id).

Desde fuera de su esquema, esto:

{ "$ref": "url://to/your/schema#root/properties/book" } 

es equivalente a esto:

{ "$ref": "url://to/your/schema#book" } 

y hellip; lo que es equivalente, desde el interior, a lo siguiente:

{ "$ref": "#root/properties/book" } 

o esto (aún desde el interior):

{ "$ref": "#book" } 

Ver mi answer here para más información.

+0

¿Hay alguna forma de crear objetos con archivos de esquema separados en node.js? – uzay95

+1

@ uzay95 los esquemas no son clases. Un esquema se usa para definir y validar la estructura de un objeto, una clase define la estructura de un objeto después de su inicialización. Si necesita clases en js, intente buscar en Typescript, AtScript o ES6. O simplemente ponga un método de fábrica de módulo o constructor dentro de un archivo externo que incluirá en node.js. –

Cuestiones relacionadas