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

使用graphql-tools,如何在Resolver中获取嵌套字段passengers的参数?

获取GraphQL嵌套字段passengers的page和count参数解决方案

嘿,这个问题我熟!你现在的问题在于找错地方拿参数啦——passengers的page和count是属于Trip类型子字段的参数,不能在顶层的Query.trip resolver里获取,得给Trip类型单独写对应的resolver才行。

核心原因

GraphQL的resolver是按字段层级分工的:

  • 顶层Query.trip的resolver只负责返回Trip的基础数据(比如code、driver关联信息这些)
  • 当客户端请求trip时同时请求passengers字段,GraphQL会自动调用Trip.passengers这个专属resolver,这时候才能拿到该字段的参数

具体代码修改

把你的Resolver改成这样,新增Trip类型的resolver:

// 导入必要的模块(比如Trip、User模型)...
export default {
  Query: {
    async trip(_, { id }, ctx, info) {
      // 这里只需要返回Trip的基础数据,passengers的逻辑交给下面的resolver
      return await Trip.findById(id);
    },
  },
  // 新增Trip类型的resolver,处理它的子字段
  Trip: {
    async passengers(parent, { page, count }, ctx, info) {
      // parent就是上面Query.trip返回的Trip对象,能拿到trip的id等信息
      // 这里直接就能获取page和count参数啦!
      // 示例:根据trip的id关联查询乘客,做分页处理
      const defaultPage = page || 1;
      const defaultCount = count || 10;
      
      return await User.find({ tripIds: parent._id })
        .skip((defaultPage - 1) * defaultCount)
        .limit(defaultCount);
    },
  },
};

特殊情况:如果非要在顶层Query里获取参数

一般不推荐这么做(违反职责分离,维护成本高),但如果有批量查询优化之类的特殊需求,可以通过info参数解析请求的AST结构:

async trip(_, { id }, ctx, info) {
  // 从info里找到passengers字段的参数
  const passengersSelection = info.fieldNodes[0].selectionSet.selections.find(
    sel => sel.name.value === 'passengers'
  );
  
  let page = 1;
  let count = 10;
  if (passengersSelection?.arguments) {
    const pageArg = passengersSelection.arguments.find(arg => arg.name.value === 'page');
    const countArg = passengersSelection.arguments.find(arg => arg.name.value === 'count');
    
    page = pageArg ? pageArg.value.value : page;
    count = countArg ? countArg.value.value : count;
  }
  
  // 这里可以用page和count做提前处理,比如预加载分页后的乘客数据
  const trip = await Trip.findById(id);
  // ...你的其他逻辑
  return trip;
}

但还是建议优先用第一种方式,代码更清晰,符合GraphQL的设计理念。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:24:43