GraphQL嵌套对象Mutation报错求助:输入输出类型冲突
解决GraphQL嵌套对象Mutation的Input/Output类型冲突问题
我来帮你理清这个问题——你遇到的核心矛盾是GraphQL里**输出类型(Type)和输入类型(Input)**的区别没搞清楚,这是刚接触嵌套Mutation时很容易踩的坑!
问题根源
GraphQL对数据的"进"和"出"有严格区分:
- 输出类型(用
type定义):用来描述API返回给客户端的数据结构(比如查询Applicant时返回的name、contacts结构) - 输入类型(用
input定义):用来描述客户端传给API的参数结构(比如Mutation时提交的name、contacts参数)
你一开始直接用输出类型Name作为Mutation的参数类型,GraphQL会报错要求Input Type;但如果你把Name改成Input类型,查询时又找不到对应的输出结构,就会反过来报错要求Output Type。
正确的解决方案:分开定义Input和Type
你需要为嵌套的name和contacts分别定义输入结构和输出结构,两者各司其职。
1. 修正后的schema.js
# 定义输出类型(用于查询返回) type Applicant { id: ID! name: Name! contacts: Contacts! } type Name { first: String! last: String! } type Contacts { phone: String! email: String! } # 定义输入类型(用于Mutation参数) input NameInput { first: String! last: String! } input ContactsInput { phone: String! email: String! } # Mutation使用输入类型作为参数,返回输出类型 type Mutation { addApplicant(name: NameInput!, contacts: ContactsInput!): Applicant! }
2. 对应的resolver.js实现
// 模拟数据库存储 let applicants = []; let nextId = 1; const resolvers = { Mutation: { addApplicant: (_, args) => { // 把输入参数转换成符合输出类型的对象 const newApplicant = { id: nextId++, name: { first: args.name.first, last: args.name.last }, contacts: { phone: args.contacts.phone, email: args.contacts.email } }; applicants.push(newApplicant); return newApplicant; } } }; module.exports = resolvers;
为什么之前的错误会发生?
- 第一次报错:你用输出类型
Name作为Mutation的参数,GraphQL明确要求参数必须是Input Type,所以提示The type of Mutation.addApplicant(name:) must be Input Type but got: Name!. - 第二次报错:你可能把原来的
type Name改成了input Name,但查询Applicant时需要输出类型Name,此时没有对应的输出类型定义,所以报错要求Output Type。
关键要点总结
- 永远不要混用
type和input:输入用input,输出用type - 嵌套结构的Mutation必须为每个嵌套层级分别定义Input和Type
- resolver里需要把输入参数映射成符合输出类型的对象返回
内容的提问来源于stack exchange,提问作者RayedB
相关产品推荐
相关产品推荐

