2017-08-30 64 views
18

Chúng tôi đang xem xét việc sử dụng GraphQL cho phiên bản 2 của CMS không đầu mà chúng tôi đang phát triển. Trong phiên bản 1 của CMS này, chúng tôi sử dụng Lược đồ JSON để xác thực từng tài liệu trước một lược đồ trước khi được lưu trong cơ sở dữ liệu - ví dụ, nếu đó là một bài viết trên blog, nó sẽ được xác nhận theo lược đồ Article, và nếu đó là một danh sách tròn ("tốt nhất"), nó sẽ được xác thực theo lược đồ Roundup.Cách sử dụng lược đồ GraphQL để xác thực dữ liệu giống như Lược đồ JSON?

Đối với phiên bản 2, chúng tôi đang dự tính sử dụng GraphQL cho API. Và sau đó nó xảy ra với chúng tôi rằng lược đồ GraphQL về cơ bản song song với Lược đồ JSON - nó mô tả cấu trúc tài liệu, loại trường, v.v.

Vì vậy, chúng ta chỉ có thể có một nguồn sơ đồ lược đồ. và sử dụng cả hai để truy vấn tài liệu và để xác thực tài liệu mới khi bản sửa đổi mới đang được lưu. (Lưu ý rằng tôi đang nói về việc xác thực hợp lệ dữ liệu JSON dựa trên lược đồ GraphQL, không xác thực truy vấn GraphQL đối với một lược đồ.)

Tôi tìm dữ liệu sẽ được xác nhận đối với tất cả các trường trong lược đồ, ngoại trừ các trường không được chấp nhận, vì bạn chỉ muốn xác thực với "phiên bản mới nhất" của các trường.

Chúng ta có thể làm một trong ba điều:

  1. Sử dụng GraphQL AST trực tiếp để xác nhận một tài liệu, ví dụ: viết một validator dữ liệu bản thân.
  2. Sử dụng AST đồ thị để tạo một Giản đồ JSON và sử dụng trình xác thực lược đồ JSON chuẩn để thực sự xác thực nó. Chỉ cần chấp nhận rằng GraphQL không hoàn toàn phù hợp để xác nhận, và xác định lược đồ hai lần - một lần trong GraphQL để truy vấn, và một lần nữa trong JSON Schema để xác nhận (gây phiền nhiễu và dễ bị lỗi để giữ chúng đồng bộ).

Câu hỏi: Có phải ý tưởng ngớ ngẩn # 1 và # 2 không? Có bất kỳ công cụ GraphQL nào thực hiện việc xác thực dữ liệu này không? Có cách nào khác để đạt được điều này mà không định nghĩa lược đồ hai lần không?

Để tham khảo, chương trình phụ trợ của chúng tôi sẽ được viết bằng Python nhưng giao diện người dùng quản trị sẽ là Phản hồi và JavaScript phía máy khách. Đây là phiên bản cắt giảm của các loại schema GraphQL chúng ta đang nói về (hỗ trợ "Điều" và "Roundup" các loại tài liệu):

schema { 
    query: Query 
} 

type Query { 
    documents: [Document!]! 
    document(id: Int): Document! 
} 

interface Document { 
    id: Int! 
    title: String! 
} 

type Article implements Document { 
    id: Int! 
    title: String! 
    featured: Boolean! 
    sections: [ArticleSection!]! 
} 

union ArticleSection = TextSection | PhotoSection | VideoSection 

type TextSection { 
    content: String! 
    heading: String 
} 

type PhotoSection { 
    sourceUrl: String! 
    linkUrl: String 
    caption: String 
    content: String 
} 

type VideoSection { 
    url: String! 
} 

type Roundup implements Document { 
    id: Int! 
    title: String! 
    isAward: Boolean! 
    intro: String 
    hotels: [RoundupHotel!]! 
} 

type RoundupHotel { 
    url: String! 
    photoUrl: String @deprecated(reason: "photoUrl is deprecated; use photos") 
    photos: [RoundupPhoto!]! 
    blurb: String! 
    title: String 
} 

type RoundupPhoto { 
    url: String! 
    caption: String 
} 
+1

Bạn có biết https://github.com/jakubfiala/graphql-json-schema không? Tôi đã thử nó với giản đồ graphql của bạn và những điều cơ bản nhìn tốt với tôi. https://runkit.com/fdlk/59baf17d01ac700012e110b4 Ma quỷ có thể là chi tiết. – flup

+0

có lý do nào bạn muốn sử dụng GraphQL không? Có vẻ như bạn sẽ mất rất nhiều kể từ khi bạn có xác thực lược đồ thực tế. –

Trả lời

1

Mức độ chắc chắn trong phát triển tình hình

GraphQL là vẫn là một công nghệ phát triển (as it says right at the top of the spec document) vì vậy nó an toàn để nói rằng không có câu trả lời "chính xác" thực sự cho việc này.

ngành phổ thông

loại InputObject ("đầu vào" trong giao diện về Definition Language) cùng với danh sách ("[]" trong thuật ngữ IDL) cùng với vô hướng khác nhau dường như hoàn toàn bù đắp những gì bạn có thể làm trong JSON. Nếu việc triển khai Python của GraphQL phù hợp với spec, thì việc cung cấp dữ liệu dưới dạng GraphQL literals hoặc (tốt hơn) là "variables" sẽ cung cấp mọi thứ mà một xác nhận hợp lệ có thể: xác thực GraphQL sẽ làm điều đúng.

Đề xuất cho trường hợp của bạn

Dựa trên công việc của tôi với GraphQL cho đến nay, đề xuất của tôi là "đi với ngũ cốc". Nếu lược đồ GraphQL của bạn phù hợp với những gì kiến ​​trúc dữ liệu của bạn yêu cầu, chỉ cần sử dụng xác thực GraphQL bình thường. Nếu bạn làm tự mình xác thực, nó sẽ đến sau GraphQL đã thực hiện kiểm tra hình dạng dữ liệu bình thường của nó.

Để tóm tắt các điểm nêu trên và trả lời câu hỏi của bạn bằng một câu hỏi: việc cho phép GraphQL hoạt động bình thường có hiệu quả như thế nào?

+0

Cảm ơn. Sau khi xem xét kỹ hơn một chút, tôi nghĩ vấn đề chính là các kiểu đầu vào không thể hoặc chứa các công đoàn. Lược đồ của chúng tôi chắc chắn chứa các công đoàn, vì vậy chúng tôi không thể sử dụng nó làm kiểu đầu vào cho một đột biến (không có hack). Xem thêm https://github.com/facebook/graphql/issues/114 –

+0

Tôi có sai khi bạn có thể có một truy vấn đầu vào (có phải là một truy vấn 'hoặc' biến thể') cho mỗi loại đầu vào không? (Bạn sẽ tự động tạo chúng từ các tổ hợp đầu vào hiện có của mình) Hoặc bạn đang nói người yêu cầu của bạn sẽ không biết loại đó là gì? Nếu trường hợp đó xảy ra, bạn có thể có một truy vấn "gửi đi" chung, kết quả của nó là loại công đoàn? –

+0

Tôi không hoàn toàn chắc chắn những gì bạn đang đề xuất: bạn có nghĩa là có 'updateArticle()' và 'updateRoundup()' đột biến? Có, bạn có thể làm điều đó. Các công đoàn bên trong vẫn còn là một vấn đề, như 'ArticleSection' ở trên - bạn có thể hack xung quanh với kiểu' ArticleSectionInput' với các trường nullable cho mỗi kiểu trong union, ví dụ: 'textSection',' photoSection' và 'videoSection'. .. nhưng nó khá lộn xộn. –

Các vấn đề liên quan