AWS Amplify не генерирует правильную глубину ввода graphql

Я новичок как в graphql, так и в AWS Amplify, поэтому, пожалуйста, простите любое незнание :)

У меня есть такая схема graphql:

type Location @model @auth(rules: [{allow: owner}]){
  street: String
  city: String
  state: String
  zip: String
}

type Trip @model @auth(rules: [{allow: owner}]){
  id: String!
  ...
  location: Location
}

Я пытаюсь создать и местоположение, и поездку одновременно с таким запросом на изменение:

mutation {
  createTrip(input: {
      id: "someIdentifier",
      location: {
        street: "somewhere"
      }
  }) {
      id
      location {
        street
      }
  }
}

Но я получаю такую ​​ошибку:

{
  "data": null,
  "errors": [
    {
      "path": null,
      "locations": [
        {
          "line": 2,
          "column": 21,
          "sourceName": null
        }
      ],
      "message": "Validation error of type WrongType: argument 'input' with value '...' contains a field not in 'CreateTripInput': 'location' @ 'createTrip'"
    }
  ]
}

Проверяя сгенерированный schema.graphql файл, я вижу, что в модели ввода действительно нет объекта location:

input CreateTripInput {
  id: String!
  ...
}

Как я могу сгенерировать правильную схему ввода, чтобы я мог одновременно создавать объекты Поездки и локации?


person Donato Perconti    schedule 20.05.2019    source источник


Ответы (1)


Мне удалось получить ответ от команды aws-ampify здесь. Обобщить:

И Поездка, и Местоположение имеют директиву model. Нет директивы @connection, связывающей Поездку с Местоположение. Есть два варианта "решения" этой проблемы:

Обновите схему, соединяющую модели, если вы хотите, чтобы они находились в 2 отдельных таблицах и хотите иметь возможность запрашивать поездку на основе местоположения. Однако, используя две отдельные таблицы, вы не сможете создать одновременно поездку и местоположение в одной мутации. Например:

type Location @model @auth(rules: [{allow: owner}]){
  street: String
  city: String
  state: String
  zip: String
  trips: Trip @connection(name:"TripLocation")
}

type Trip @model @auth(rules: [{allow: owner}]){
  id: String!
  location: Location @connection(name:"TripLocation")
}

Второй вариант: если данные о местоположении очень специфичны для поездки и вы не хотите создавать отдельную таблицу, избавьтесь от директивы @model в типе местоположения. Это позволит вам создать Location как часть той же мутации.

type Location {
  street: String
  city: String
  state: String
  zip: String

}

type Trip @model @auth(rules: [{allow: owner}]){
  id: String!
  location: Location
}

Последнее было решением, к которому я пришел.

person Donato Perconti    schedule 21.05.2019