Amplify中如何复用@model生成的CreateTodoItemInput输入类型?
解决Amplify自定义Lambda覆盖create mutation时复用默认输入类型的问题
你遇到的这个问题其实挺常见的——Amplify自动生成的CreateTodoItemInput这类输入类型,是在构建阶段基于你的@model模型动态生成的,并没有出现在你手写的schema.graphql文件里,所以直接在自定义mutation里引用它,schema验证环节肯定会报错说找不到这个类型。
目前没有办法直接复用这个自动生成的输入类型,不过有个简单的替代方案,而且不会影响前端的使用体验:
手动定义与自动生成结构一致的输入类型
你只需要在schema.graphql里手动写一个和Amplify自动生成的CreateTodoItemInput完全一样的输入类型,然后在自定义mutation里使用它就行。
举个例子,假设你的TodoItem模型是这样的:
type TodoItem @model { id: ID! content: String! completed: Boolean }
那Amplify自动生成的CreateTodoItemInput会是:
input CreateTodoItemInput { content: String! completed: Boolean }
你直接把这个输入类型复制到自己的schema.graphql里,再定义自定义的mutation:
# 手动定义和自动生成一致的输入类型 input CreateTodoItemInput { content: String! completed: Boolean } # 自定义mutation,用@function指向你的Lambda type Mutation { createTodoItem(input: CreateTodoItemInput!): TodoItem @function(name: "createTodoItem-${env}") }
这样做的好处是:
- 前端生成的代码完全不需要改动,依然可以用原来的
CreateTodoItemInput类型调用createTodoItem方法 - 你的Lambda函数接收到的输入结构和默认mutation完全一致,不需要额外适配
- Amplify在构建时会用你自定义的mutation覆盖默认的create mutation,不会产生冲突
注意事项
- 后续如果修改了
TodoItem模型的字段,一定要同步更新你手动定义的CreateTodoItemInput,保持结构一致,避免出现类型不匹配的问题 - 如果你担心手动写容易出错,可以先执行一次
amplify push(不添加自定义mutation),然后在amplify/generated/graphql/schema.graphql里找到自动生成的CreateTodoItemInput,直接复制过来用就行
内容的提问来源于stack exchange,提问作者vorant94
相关产品推荐
相关产品推荐

