GraphQL Query/Mutation正常但Subscription返回null数据问题
问题说明
Schema结构如下:

服务端配置如下:
现象:Query、Mutation操作执行完全正常,仅Subscription操作返回的data为null,执行结果如下:
根因排查方向
按出现概率从高到低排序:
- Subscription resolver返回格式不符合规范
Query、Mutation的resolver可以直接返回字段对应的值,但Subscription的事件payload必须以订阅字段名为key包装后再publish,否则GraphQL执行层无法匹配到对应字段的值,就会返回null。
例:订阅字段为postCreated时,错误写法是直接pubsub.publish('POST_CREATED', postData),正确写法必须包装字段:pubsub.publish('POST_CREATED', { postCreated: postData })。这是该问题最常见的诱因。 - WebSocket订阅链路配置缺失
Query和Mutation走HTTP协议即可正常运行,Subscription依赖WebSocket长连接传输。如果服务端WebSocket配置没有和HTTP链路复用相同的schema、resolver、context规则,或者pubsub实例不统一(publish和subscribe用了两个独立的PubSub实例),就会出现连接建立成功但事件无法正确解析、返回null的情况。重点核对subscriptions通道的配置参数是否和HTTP端点完全一致。 - 字段类型校验不通过
如果Schema中订阅返回字段标记了非空(!),但resolver实际返回的对应字段值为undefined,部分GraphQL实现不会抛出明确类型错误,会直接返回整个data字段为null。
快速定位技巧:在Subscription的subscribe方法、字段resolve方法中分别打印入参和返回值,确认事件触发时是否拿到了预期数据、payload格式是否符合要求,10分钟内就能定位到具体问题。
内容的提问来源于stack exchange,提问作者Malik Abdulaziz
相关产品推荐
相关产品推荐

