GraphQL查询返回Null问题排查:根据Roll值查询学生数据失败
问题排查:GraphQL按roll查询学生返回Null的原因
我尝试在GraphQL中根据roll值查询特定学生数据,但查询返回Null,执行Mutation操作同样返回Null。以下是我的代码:
const { ApolloServer } = require("@apollo/server"); const { startStandaloneServer } = require("@apollo/server/standalone"); const students = [ { name: "langesh", roll: 131, }, { name: "ram", roll: 134, }, ]; const typeDefs = `#graphql type Student { name: String, roll: Int, } type Query { students: [Student] student(roll: Int) : Student } `; const resolvers = { Query: { students: () => students, student: (parent, roll) => { return students.find((s) => s.roll === roll); }, }, }; const server = new ApolloServer({ typeDefs, resolvers }); async function startServer() { const { url } = await startStandaloneServer(server, { listen: { port: 8000, }, }); console.log(`url : ${url}`); } startServer();
问题根源
student查询的resolver参数处理错误。GraphQL resolver的第二个参数是包含所有查询参数的对象,不是单个参数值。你直接把第二个参数命名为roll,实际拿到的是整个参数对象(比如当你传入roll:131时,这个参数是{roll:131}),用学生的roll数值和这个对象比较,永远不会相等,所以find方法找不到匹配项,返回undefined,最终GraphQL将其转为Null返回。
修正方案
修改resolver,从参数对象中提取roll值,有两种写法:
写法1:解构参数对象
student: (parent, { roll }) => { return students.find((s) => s.roll === roll); }
写法2:通过args对象访问
student: (parent, args) => { return students.find((s) => s.roll === args.roll); }
修正后的完整resolvers代码:
const resolvers = { Query: { students: () => students, student: (parent, { roll }) => { return students.find((s) => s.roll === roll); }, }, };
重新启动服务后,按roll查询学生就能返回正确结果了。
内容的提问来源于stack exchange,提问作者Langesh
相关产品推荐
相关产品推荐

