Xử lý các chỉ thị kiểu schema
Gato GraphQL là một máy chủ code-first, tức là nó sử dụng code để phát triển schema. (Phương án thay thế là cách tiếp cận SDL-first, sử dụng Ngôn ngữ Định nghĩa Schema để tạo ra schema trước rồi mới phát triển dịch vụ).
Vì không có SDL, các máy chủ code-first không thể hỗ trợ chỉ thị kiểu schema một cách tự nhiên. Để khắc phục giới hạn này, Gato GraphQL đã phát triển cơ chế sau:
- Chuyển đổi queries từ dạng yêu cầu sang dạng thực thi
- Áp dụng các quy tắc IFTTT vào queries thực thi
Kết quả là hỗ trợ đầy đủ cho các chỉ thị kiểu schema trên máy chủ GraphQL.
Tại sao điều này hoạt động được?
@deprecated là một chỉ thị kiểu schema, vì vậy nó phải được áp dụng trên schema. Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta giả định trong chốc lát rằng nó là một chỉ thị kiểu query, và thêm @deprecated trực tiếp vào một trường trong query?
Ví dụ, khi thực thi query này:
query {
posts {
id
title
content @deprecated(reason: "Use newContent instead")
}
}Thực ra, nó vẫn có thể hoạt động được! Vì suy cho cùng, một chỉ thị chỉ là một chức năng được thực thi trên trường đó; việc khai báo chức năng đó qua schema hay trực tiếp trong query không làm thay đổi cách chức năng hoạt động.
Tuy nhiên, dù hoạt động được, điều này không có ý nghĩa thực tiễn. Chúng ta không thể bắt buộc các client phải thêm @deprecated vào queries của họ. Đây là chức năng được quyết định bởi ứng dụng ở phía máy chủ, không phải ở phía client.
Tuy vậy, bản thân chức năng vẫn hoạt động. Do đó, từ góc độ chức năng, việc chỉ thị được thêm vào schema hay vào query không có sự khác biệt. Hơn nữa, mọi chỉ thị cuối cùng đều sẽ xuất hiện trong query, vì đó là nơi nó được thực thi.
Do đó, nếu máy chủ không có SDL, nó vẫn có thể nhúng chỉ thị vào query tại thời điểm chạy.