GraphQL客户端查询参数与服务端Schema、Resolver参数关联逻辑咨询
GraphQL客户端、Schema、Resolver三者的参数关联规则
参数关联的核心逻辑是严格按参数名称匹配,全程大小写敏感,具体分两个校验/匹配阶段:
1. 客户端查询参数与服务端Schema的匹配
客户端发起查询时,给字段传入的参数名必须和Schema中该字段定义的参数名完全一致,GraphQL服务端收到请求后会首先执行校验:
- 校验传入的参数是否是Schema中该字段允许定义的参数
- 校验传入参数的类型是否和Schema定义的类型匹配
如果校验不通过,请求会直接报错返回,不会进入Resolver执行逻辑。
以你给出的示例为例:
客户端查询中写的是launches(after: $after),其中参数名after和Schema中launches字段定义的after: String参数名完全匹配,且传入的$after类型为String符合要求,所以校验通过。
2. Schema参数与Resolver入参的匹配
字段对应的Resolver函数的第二个入参,是所有校验通过的传入参数的集合对象,对象的key就是Schema中定义的参数名,value就是客户端传入的实际参数值。你可以直接通过参数名解构拿到对应的值,名称不匹配就无法拿到值。
以你给出的示例为例:
Resolver中launches函数的第二个参数解构{ pageSize = 20, after },这里的after参数名和Schema中定义的after完全一致,所以就能直接拿到客户端传入的$after变量的实际值,用于后续分页逻辑。如果Schema中定义的是after,你在Resolver中解构写afterCursor,是拿不到对应值的。
示例完整流转逻辑补充:
- 客户端定义查询变量
$after: String,赋值后传给查询里launches字段的after参数- 请求发送到GraphQL服务端,首先完成参数和Schema的校验,确认合法后进入执行阶段
- 服务端将所有合法参数整合成对象,传入
launches对应的Resolver的第二个参数- Resolver中按参数名解构拿到
after值,传入分页函数得到返回结果
补充注意点
- 对于Schema中定义的可选参数,如果客户端没有传值,Resolver中拿到的对应值为
undefined,你可以像示例中的pageSize = 20一样自行设置默认值 - 参数匹配全程大小写敏感,
after和After会被识别为两个完全不同的参数
内容的提问来源于stack exchange,提问作者Code Eagle
相关产品推荐
相关产品推荐

