GraphQL Mutation传入参数始终为undefined,该如何解决?
GraphQL Mutation参数undefined问题解决
我正在学习GraphQL,目前无法让Mutation功能正常工作,对线上示例感到困惑。以下是我编写的基于Express的GraphQL服务代码:
import express from 'express' import cors from 'cors' import { graphqlHTTP } from 'express-graphql' import { makeExecutableSchema } from '@graphql-tools/schema' const app = express() const port = 4000 // In-memory data store const data = { warriors: [ { id: '001', name: 'Jaime' }, { id: '002', name: 'Jorah' }, ], } // Schema const typeDefs = ` type Warrior { id: ID! name: String! } type Query { warriors: [Warrior] } type Mutation { addUser(name: String!): Warrior! } ` // Resolver for warriors const resolvers = { Query: { warriors: (obj, args, context) => context.warriors, }, Mutation: { //addUser: (parent: unknown, args: {name: String}) => { addUser: (name) => { console.log('------ 1 ----------'); const id = String(data.warriors.length + 1); const warrior = {id, name}; console.dir(warrior); console.log('------ 3 ----------'); data.warriors.push(warrior); return data.warriros; }, }, } const executableSchema = makeExecutableSchema({ typeDefs, resolvers, }) app.use(cors()) app.use(express.json()) app.use(express.urlencoded({ extended: true })) // Entrypoint app.use( '/graphql', graphqlHTTP({ schema: executableSchema, context: data, graphiql: true, }) ) app.listen(port, () => { console.log(`Running a server at http://localhost:${port}`) })
我在http://localhost:4000/graphql的GraphiQL中执行如下Mutation语句:
mutation { addUser(name: "ccc") { id } }
但传入的name参数始终为undefined,请问该如何解决?
正确的Resolver代码
// Resolver for warriors const resolvers = { Query: { warriors: (obj, args, context) => context.warriors, }, Mutation: { addUser: (_, {name}) => { const id = String(data.warriors.length + 1); const warrior = {id, name}; data.warriors.push(warrior); return warrior; }, }, }
错误原因说明
- Resolver参数使用错误:GraphQL的resolver函数固定接收四个参数,顺序为
(parent, args, context, info)。你直接将第一个参数当作name,但第一个参数是父类型对象(Mutation操作无父对象,通常用_占位),请求参数需要从第二个参数args中解构获取。 - 返回值错误:原代码中返回
data.warriros存在拼写错误(应为warriors),且根据Schema定义,addUser需要返回单个Warrior对象,因此应返回新创建的warrior实例。
内容的提问来源于stack exchange,提问作者user3552178
相关产品推荐
相关产品推荐

