You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:20:23