Khái niệm, ý tưởng, chiến lược
Khái niệm, ý tưởng, chiến lượcCác trường hợp sử dụng versioning fields và directives

Các trường hợp sử dụng versioning fields và directives

Vui lòng đọc trước hướng dẫn Phát triển schema thông qua field versioning, trong đó giải thích tính năng "field versioning" trong Gato GraphQL.

Gato GraphQL cho phép các fields và directives nhận đối số versionConstraint, để chọn phiên bản cụ thể (tức là cài đặt) nào của field/directive sẽ được sử dụng:

query GetPosts {
  posts(versionConstraint: "^1.0") {
    id
    title(versionConstraint: ">=2.1")
    excerpt @strUpperCase(versionConstraint: "~1.5.3")
  }
}

Một field (hoặc directive) cũng có thể có một cài đặt mặc định, đó là cài đặt không có phiên bản (và là cài đặt được sử dụng khi versionConstraint không được cung cấp trong query).

Khi thực hiện introspection, chỉ dữ liệu của các fields và directives mặc định được truy xuất. Kết quả là, đối số versionConstraint sẽ không bao giờ xuất hiện khi thực hiện introspection, vì field hoặc directive mặc định không hỗ trợ nó.

Vì vậy, chúng ta phải luôn biết trước rằng một field hoặc directive có hai hoặc nhiều phiên bản để lựa chọn, và phải biết những số phiên bản đó là gì. Thông tin này, theo mặc định, không được công khai.

Vậy thì, versioning hữu ích như thế nào? Dưới đây là một số trường hợp sử dụng.

Cung cấp bản vá lỗi nhanh cho một người dùng cụ thể

Giả sử bạn có một API GraphQL được triển khai trên website của mình, và một người dùng cụ thể phàn nàn rằng field không hoạt động như mong đợi. Nhưng điều này chỉ xảy ra với người dùng đó; không ai khác dường như gặp vấn đề.

Bạn xác định và sửa lỗi, nhưng muốn chắc chắn rằng nó hoạt động trước khi triển khai thay đổi cho tất cả mọi người. Khi đó, bạn có thể triển khai thay đổi dưới một field resolver mới với phiên bản "1.0.1", và yêu cầu người dùng gặp vấn đề thay đổi GraphQL query để trỏ đến phiên bản này của field:

{
  someBuggyField(versionConstraint: "1.0.1")
}

Nếu lỗi đã thực sự được sửa, chỉ khi đó mới sao chép code vào field resolver mặc định.

Yêu cầu những người dùng được chọn thử nghiệm một bản phát hành sắp tới

Nếu một field hoặc directive được đánh phiên bản, và không có cài đặt mặc định (tức là không có phiên bản), thì nó sẽ không xuất hiện trong quá trình introspection.

{
  someField
    # This directive has no default implementation,
    # so it won't appear during introspection,
    # but it can still be added in the GraphQL query
    # when providing a constraint that satisfies it
    @someExperimentalDirective(versionConstraint: ">1.0")
}

Sau đó bạn có thể triển khai field hoặc directive và nó sẽ không hiển thị trong API GraphQL, đồng thời yêu cầu những người dùng được chọn thử nghiệm nó, những người này phải nhập đối số versionConstraint tương ứng vào queries của họ để sử dụng.

Sau khi được chấp nhận, versioning sẽ bị loại bỏ, và field hoặc directive trở nên hiển thị qua introspection, và do đó có sẵn cho tất cả mọi người.