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:
- 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.
- 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
}
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
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ế. –