2011-11-18 11 views
32

Tôi đang cố gắng xác thực API JSON của mình bằng cách sử dụng node.js + json-schema.js từ commonjs-utils. Chỉ cần xác nhận một lần là dễ dàng nhưng không thể tìm được cách đúng đắn để quản lý nhiều tệp lược đồ để cho phép tham chiếu lẫn nhau.Làm cách nào để quản lý nhiều tệp lược đồ JSON?

Giả sử tôi có hai Mô hình & hai 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" } } 
    } 
} 

Mỗi lược đồ phải được chia thành tệp riêng và trực tuyến? Hoặc tôi có thể kết hợp thành tệp lược đồ duy nhất như dưới đây không? Nếu có thể, làm thế nào tôi có thể tham khảo lược đồ cục bộ?

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

Trả lời

46

Trong JSON Schemas, bạn có thể đặt một sơ đồ cho mỗi tập tin và sau đó truy cập chúng bằng URL của họ (nơi bạn lưu trữ chúng), hoặc một sơ đồ lớn với id thẻ.

Đây là một tập tin lớn:

{ 
    "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" 
     } 
    } 
} 

Sau đó bạn có thể tham khảo validator của bạn với một trong những schemas phụ (được định nghĩa với một id).

Từ bên ngoài của giản đồ của bạn, điều này:

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

tương đương với điều này:

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

& hellip; đó là tương đương, từ bên trong, như thế này:

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

hay này (vẫn từ bên trong):

{ "$ref": "#book" } 

Xem answer here tôi để biết thêm thông tin.

+0

Có cách nào để tạo đối tượng với các tệp lược đồ được phân tách trong node.js không? – uzay95

+1

@ uzay95 lược đồ không phải là lớp học. Một lược đồ được sử dụng để xác định và xác nhận cấu trúc của một đối tượng, một lớp định nghĩa cấu trúc của một đối tượng sau khi nó khởi tạo. Nếu bạn cần các lớp trong js, hãy thử xem Typecript, AtScript hoặc ES6. Hoặc chỉ cần đặt một phương thức factory hoặc constructor factory trong một tệp bên ngoài mà bạn sẽ bao gồm trong node.js. –