如何使用 AWS AppSync/DynamoDB (React Native) 创建一个以联合作为字段的突变

How do you create a Mutation which has a Union as a field with AWS AppSync / DynamoDB (React Native)

我已经弄清楚如何创建新用户并将基本字段写入 DynamoDB,例如用户名(字符串),但我找不到将 Union 作为输入之一的方法。

在我的示例中,当用户注册时,我想知道正在使用应用程序的用户类型:是教师还是学生(应用程序将使用此信息来显示不同的 UI取决于用户类型)

我还没有找到这方面的任何例子,所以也许这是不可能的?有没有人这样做过?有谁知道你能不能做到?或者也许我不应该试图将其保存为一个联盟...

我正在使用 react-native、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
      }
    }
  }
}
`;

然后是实际的 React Native 部分:

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

您可以在 graphQL 查询中使用 Union(https://graphql.org/learn/schema/) and (https://www.apollographql.com/docs/apollo-server/schema/unions-interfaces/)

但是问题是 输入联合 不支持突变。具体来说,这段代码是正确的

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

我认为以下代码部分对您不起作用,因为您正试图将 Union 作为输入传递。 Mutation 不能将 union 作为输入。

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

突变只能采用标量类型或称为 Input 的特殊类型,它可以是映射对象,但所有内部字段 必须是 标量类型。

所以你不能使用 Union for Mutations。其实我不同意LxL的例子,你应该把你的mutation schema定义的类型分离成都是Input类型,然后用Union来查询。

一个潜在的解决方案是为 Teacher/Student 使用枚举类型并将类型扁平化为一个 Input 类型,然后在解析器中处理差异(如果存在)是不同的领域。

我可以像这样使用枚举:

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

enum UserType {
  Teacher
  Student
}

然后当用户注册时,如果他们 select "Teacher":

我可以调用它
await API.graphql(graphqlOperation(createUser, { input: { name: name, userType: 'Teacher' } }));

或者如果用户 select 的学生我可以打电话给...

await API.graphql(graphqlOperation(createUser, { input: { name: name, userType: 'Student' } }));

然后当用户在应用程序中时,如果我想找出要显示的配置文件:

   if (user.userType === 'Teacher') {
       navigation.navigate('TeacherProfile');
     } else if (user.userType === 'Student') {
       navigation.navigate('StudentProfile');
     }