如何在GraphQL中间件中访问解析器的祖父级参数roomId?
获取GraphQL中间件中祖父级字段的参数
针对你在case字段中间件中需要获取祖父级room字段的roomId参数的问题,提供以下几种可行方案:
方案一:直接从查询变量中获取
如果roomId是通过查询变量传入的(如你的示例查询所示),可以直接通过info.variables访问,这是最简单直接的方式:
export const globalMiddleware = async (resolve, root, args, context, info) => { // 直接获取顶层查询变量中的roomId const roomId = info.variables.roomId; console.log(roomId); // 输出祖父级参数roomId console.log(args.caseId); // 当前字段参数 console.log(root.closetId); // 父级返回的字段值 // 执行你的验证逻辑 return await resolve(root, args, context, info); };
方案二:遍历AST节点提取父级参数
如果roomId不是来自查询变量(比如是字面量参数),可以通过遍历GraphQL的AST节点,向上查找目标字段的参数:
export const globalMiddleware = async (resolve, root, args, context, info) => { let roomId; let currentNode = info.fieldNodes[0]; // 向上遍历字段的父节点,找到room字段 while (currentNode.parent) { currentNode = currentNode.parent; if (currentNode.name.value === 'room') { // 提取roomId参数 const roomIdArg = currentNode.arguments.find(arg => arg.name.value === 'roomId'); if (roomIdArg) { // 区分参数是变量还是字面量 roomId = roomIdArg.value.kind === 'Variable' ? info.variables[roomIdArg.value.name.value] : roomIdArg.value.value; } break; } } console.log(roomId); // 拿到roomId参数 console.log(args.caseId); console.log(root.closetId); // 验证逻辑 return await resolve(root, args, context, info); };
方案三:通过Context传递父级参数
可以在父级字段的处理流程中,将roomId存入context,后续所有子字段的中间件都能直接从context中读取:
export const globalMiddleware = async (resolve, root, args, context, info) => { // 当处理room字段时,将参数存入context if (info.fieldName === 'room') { context.roomId = args.roomId; } // 在case字段中间件中直接从context获取roomId const roomId = context.roomId; console.log(roomId); console.log(args.caseId); console.log(root.closetId); // 验证逻辑 return await resolve(root, args, context, info); };
方案选择建议
- 若参数来自查询变量,优先使用方案一,代码简洁高效;
- 若参数可能是字面量或动态生成,使用方案二,兼容性更强;
- 若多个子字段都需要复用父级参数,使用方案三,避免重复查询或遍历。
内容的提问来源于stack exchange,提问作者asma
相关产品推荐
相关产品推荐

