Как передать хеш в качестве аргумента в 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
Другие вопросы по тегам