使用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
相关产品推荐
相关产品推荐

