如何在graphql-yoga中为Mutation编写Resolver?
解决GraphQL-Yoga中Mutation Resolver的编写问题
我来帮你搞定这个Mutation Resolver的问题!从你的代码和报错来看,核心问题是Mutation下的createUser还没有实现对应的处理逻辑,而且Query部分的users返回的是类型而不是实际数据,这也可能导致一些问题。下面一步步来修复:
第一步:准备模拟数据源
因为你还没有接入数据库,我们先定义一个临时数组来存储用户数据,模拟数据库的作用:
// 模拟用户存储,相当于临时数据库 let users = [ { id: '1', name: 'Alice' }, { id: '2', name: 'Bob' } ];
第二步:完善Query的Resolver
先把Query部分的逻辑补全,确保能正确返回用户列表和单个用户:
Query: { users: () => users, // 返回模拟的用户数组 user: (parent, args) => users.find(user => user.id === args.id) // 根据id查找单个用户 }
第三步:编写Mutation的createUser Resolver
现在重点实现createUser的逻辑,它需要接收前端传来的name参数,生成新用户并添加到数据源,最后返回新创建的用户:
Mutation: { createUser: (parent, args) => { // 生成唯一ID(这里用时间戳简单实现,生产环境可以用uuid库) const newUser = { id: Date.now().toString(), name: args.name }; // 将新用户添加到数组 users.push(newUser); // 返回新创建的用户(要和typeDefs中定义的User结构一致) return newUser; } }
完整代码示例
把所有部分整合起来,完整代码如下:
const { GraphQLServer } = require('graphql-yoga') // 模拟用户存储 let users = [ { id: '1', name: 'Alice' }, { id: '2', name: 'Bob' } ]; const typeDefs = ` type Query { users: [User!]! user(id: ID!): User } type Mutation { createUser(name: String!): User! } type User { id: ID! name: String! } ` const resolvers = { Query: { users: () => users, user: (parent, args) => users.find(user => user.id === args.id) }, Mutation: { createUser: (parent, args) => { const newUser = { id: Date.now().toString(), name: args.name }; users.push(newUser); return newUser; } } } const server = new GraphQLServer({ typeDefs, resolvers }) server.start(() => console.log(`Server is running on http://localhost:4000`))
测试Mutation
启动服务器后,在GraphQL Playground中运行以下突变请求:
mutation { createUser(name: "Yosua") { id name } }
你会得到新创建用户的id和name,再运行query { users }就能看到这个新用户已经被添加到列表里了。
报错原因说明
你之前的报错是因为GraphQL找不到createUser对应的Resolver函数,每个在typeDefs中定义的Query和Mutation字段,都必须在resolvers对象中对应实现处理逻辑,否则就会抛出"Cannot return null for non-nullable field Mutation.createUser"这类错误。
内容的提问来源于stack exchange,提问作者Yosua Michael
相关产品推荐
相关产品推荐

