Как передать хеш в качестве аргумента в GraphQL Mutation
Я пытаюсь передать хэш опций в качестве аргумента в моей мутации GraphQL. Я хочу обновить несколько полей для объекта, основываясь на полях, переданных в мутацию.
Это будет выглядеть так: updateStatus (statusId, options)
Я не уверен, как указать хеш / объект в typeDefs для сервера graphql-yoga, который также использует сервер apollo.
Я пробовал всюду, и никакие ресурсы не показывались для того, что должно быть чрезвычайно распространенной операцией.
3 ответа
Вам просто нужно определить новый тип для представления options
аргумент, например:
input OptionsType {
field1: Int!
field2: String
}
И затем используйте это в своей мутации:
type Mutation {
updateStatus(statusId: String!, options: OptionsType): ReturnType
}
В примерах я использовал "язык схемы GraphQL", но эту же идею легко использовать на другом языке.
GraphQL-Ruby имеет тип JSON, который поможет здесь.
https://github.com/rmosolgo/graphql-ruby/blob/master/lib/graphql/types/json.rb
# Use it for fields or arguments as follows:
# field :template_parameters, GraphQL::Types::JSON, null: false
# argument :template_parameters, GraphQL::Types::JSON, null: false
работает только для хэшей с предопределенными фиксированными ключами.(field1
иfield2
на принятом примере).
В моем сценарии мне требовался хэш с динамическими/гибкими ключами. Если кому-то интересно узнать, как я этого добился, мне удалось сделать это, объявив Принятое решениеновый скалярный тип , который отражает тип хэша языка Ruby, от Ruby до GraphQL.
Настраивать
-
app/graphql/types/hash_object.rb
class Types::HashObject < Types::BaseScalar
description 'A Hash Object'
def self.coerce_input(input_value, _context)
input_value.to_h
rescue StandardError
raise GraphQL::CoercionError, "#{input_value.inspect} is not a valid Hash"
end
def self.coerce_result(ruby_value, _context)
ruby_value.to_h
end
end
Применение
argument :my_argument_name, Types::HashObject