如何使用 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');
}
我已经弄清楚如何创建新用户并将基本字段写入 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');
}