Как обрабатывать поле, которое может возвращать один из нескольких скалярных типов в graphql
В graphql (используя превосходный graphql-ruby gem), я пытаюсь вернуть объект с полем, которое может равняться либо Булеву, целому числу, либо строке. Моя первоначальная мысль состояла в том, чтобы вернуть объединение булевых, целых или строковых чисел, но graphql-ruby сообщил мне, что объединения не могут содержать скалярные типы (я полагаю, что это ограничение, наложенное спецификацией, а не graphql-ruby).
Решение, которое я могу придумать (не очень), состоит в том, чтобы вернуть значение в виде строки json и проанализировать его на клиенте сторона. Существует ли лучший способ обработки возвращаемого значения, которое может быть одним из нескольких скаляров?
Спасибо!
1 ответ:
Я смог добиться этого, создав пользовательский скалярный тип graphql, который просто проверяет, является ли значение Булевым, целочисленным или строковым, и если да, то возвращает это значение без изменений. В противном случае возвращается ошибка. Это решение не требует дополнительного анализа на стороне клиента.
В graphql-ruby реализация выглядит как
GraphScalar::AnyPrimative = GraphQL::ScalarType.define do name "AnyPrimativeScalar" coerce_input ->(value, ctx) { case value when String, TrueClass, FalseClass, Integer, Float then value else GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}") end } coerce_result ->(value, ctx) { case value when String, TrueClass, FalseClass, Integer, Float then value else GraphQL::ExecutionError.new("Invalid value type: #{value.class.name}") end } end
Примечание: эта реализация фактически позволяет использовать поплавки