Как создать мутацию с полем Union в AWS AppSync / DynamoDB (React Native) - PullRequest
0 голосов
/ 30 сентября 2019

Я разработал, как создать нового пользователя и записать базовые поля в DynamoDB, такие как имя пользователя (строка), но я не могу найти способ использовать Union в качестве одного из входных данных.

В моем примере, когда пользователь регистрируется, я хочу знать, какой тип пользователя использует приложение: будь то учитель или ученик (и приложение будет использовать эту информацию для отображения другого пользовательского интерфейса в зависимости оттип пользователя)

Я не нашел примеров этого, так что, может быть, это невозможно? Кто-нибудь делал это? Кто-нибудь знает, можно ли это сделать? Или, может быть, я не должен пытаться сохранить это как Союз ...

Я использую реактивный род, AWS Amplify, AppSync, Cognito.

Моя схема:

type User
  id: ID!
  name: String!
  userTypes: [UserType]
}

union UserType = Teacher | Student

Код сгенерированной мутации:

const registerUser = `mutation RegisterUser($input: CreateUserInput!) {
  registerUser(input: $input) {
    id
    name
    createdAt
    updatedAt
    userTypes {
      ... on Teacher {
        id
        name
        subjectsTaught
      }
      ... on Student {
        id
        name
        lessons
      }
    }
  }
}
`;

Тогда фактическая реакция родной части:

try {
            await API.graphql(graphqlOperation(registerUser,
                { input: { name: "Tamsyn", userTypes: { Student } } } ));
                console.log('created user');
            } catch (err) {
                console.log('error creating user', err);
            }

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Вы можете использовать объединение в запросах graphQL (https://graphql.org/learn/schema/) и (https://www.apollographql.com/docs/apollo-server/schema/unions-interfaces/)

). Однако проблема заключается в входные объединения , которые не поддерживаются для мутаций. В частности, этот разделкода верен

userTypes {
  ... on Teacher {
    id
    name
    subjectsTaught
  }
  ... on Student {
    id
    name
    lessons
  }
}

Я считаю, что у вас не работает следующий раздел кода, потому что вы пытаетесь передать Union в качестве входных данных. Мутация не может принятьобъединение в качестве входных данных.

`mutation RegisterUser($input: CreateUserInput!) { registerUser(input: $input){...}

Мутации могут принимать только скалярные типы или специальный тип, называемый Input , который может быть отображенным объектом, но все внутренние поля должныbe Скалярные типы.

Таким образом, вы не можете использовать Unions для мутаций. На самом деле, я не согласен с примером из LxL, вы должны отделить определенные вами типы схемы мутации от всех, чтобы они были Input type, а затем используйте Union для запросов.

Потенциальным решением этого является использование типа Enum для Teacher / Student и объединение типов в один тип Input , а затемсправиться с разницей яв резольвере, если есть разные поля.

0 голосов
/ 10 октября 2019

В GraphQL у нас нет типа объединения, как вы описали.

Лучшая альтернатива, которую я могу придумать, это что-то вроде этого:

type User
  id: ID!
  name: String!
  userTypes: [UserType]
}

type UserType {
   teacher: TeacherType
   user: UserType
}

type TeacherType{
   id:String
   name:String
   subjectsTaught:String
}

type UserType{
   id:String
   name:String
   lessons:String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...