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

Apollo-Server-Express GraphQL请求变量接收异常问题排查求助

根因定位与解决方案

1 最高概率根因:Resolver函数参数签名错误

Apollo Server所有Resolver的固定函数签名为 (父级返回值, 入参对象, 上下文, 元信息),共4个入参,所有客户端传入的参数都会被整合到第二个入参对象中。
你遇到的「所有参数被打包到password变量、email为undefined」的现象,完全符合Resolver参数顺序写反的特征,错误写法示例:

// 错误示例:错误将第一个参数命名为email、第二个参数命名为password
const resolvers = {
  Query: {
    signIn: (email, password) => {
      // 此处email实际是第一个参数:父级返回值,默认就是undefined
      // 此处password实际是第二个参数:所有入参的集合对象,包含email、password两个属性
      // 如果你业务代码里是从password对象中取email和password字段使用,就会出现返回结果正常,但参数变量名不符合预期的情况
    }
  }
}

修复方法:从第二个入参中解构所需字段即可

// 正确写法
const resolvers = {
  Query: {
    signIn: (_, { email, password }) => {
      // 此处可正常获取独立的email、password参数
    }
  }
}

2 其他可能根因及修复方案

  • 请求封装方法入参格式错误
    检查你使用的requests.post方法的参数要求,大部分HTTP库的post方法第一个参数为请求URL,第二个参数才是请求体。如果你的封装符合该规则,修改客户端代码:
signIn: (email: string, password: string) => requests.post('/你的GraphQL接口地址', {
  query: `
    query ($email: String!, $password: String!) {
        signIn(email: $email, password: $password) {
            _id
            name
            email
            avatar
            admin
            rents{
                _id
            }
            createdAt
            updatedAt
          }
        }
    `,
  variables: { email, password }
})
  • 服务端Schema入参类型不匹配
    检查服务端Schema中signIn的入参定义,如果是要求传入单个Input对象而非两个独立String参数,需要同步客户端查询写法与变量结构。
    示例Schema:
input SignInInput {
  email: String!
  password: String!
}
type Query {
  signIn(input: SignInInput!): User
}

对应客户端修改:

signIn: (email: string, password: string) => requests.post({
  query: `
    query ($input: SignInInput!) {
        signIn(input: $input) {
            _id
            name
            email
            avatar
            admin
            rents{
                _id
            }
            createdAt
            updatedAt
          }
        }
    `,
  variables: { input: { email, password } }
})
  • Body解析中间件冲突
    确认express服务的JSON解析中间件注册顺序早于Apollo Server中间件,避免请求体解析异常:
const app = express();
// 必须先注册JSON解析中间件
app.use(express.json());
// 再注册Apollo Server中间件
const server = new ApolloServer({ typeDefs, resolvers });
await server.start();
server.applyMiddleware({ app });

内容的提问来源于stack exchange,提问作者Hristo hristov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 22:09:01