如何在Apollo中映射GraphQL订阅的PubSub返回值
Apollo订阅过滤后裁剪返回字段实现方案
完全可以实现你描述的效果,无需额外引入第三方依赖:
graphql-subscriptions包内置的异步迭代器原生支持map链式调用,withFilter执行后返回的就是标准的异步迭代器实例,可以直接调用map方法对最终推送给客户端的payload做转换。- 执行逻辑顺序符合预期:过滤逻辑优先执行,过滤阶段拿到的是PubSub发布的全量原始payload(包含用于过滤判断的
username、roles等内部字段),只有判定通过、需要推送给当前连接客户端的事件,才会进入map转换逻辑,你可以在这一步安全剔除所有不需要对外暴露的字段,最终返回结构完全匹配GraphQL Schema定义。
注意你提供的示例代码存在字段拼写错误:map返回对象里的mySubsription少了一个t,需要修正为和Schema定义一致的mySubscription,否则会出现对应字段返回null的问题。
正确的resolver实现代码如下:
// 订阅resolver实现 const resolvers = { Subscription: { mySubscription: { subscribe: withFilter( () => pubsub.asyncIterator("MY_SUBSCRIPTION"), (payload, variables) => { // 此处可拿到全量payload,原有过滤逻辑完全不受影响 return customFiltering(payload, variables); } ).map((payload) => { // 仅提取需要对外暴露的字段,剔除内部过滤用字段 return { mySubscription: payload.id } }) } } }
如果你使用的graphql-subscriptions版本低于v1.1.0,内置迭代器没有提供map方法,也可以自行实现一个简单的异步迭代器包装层做字段转换,不过目前主流使用的版本都已原生支持该能力,直接链式调用即可。
内容的提问来源于stack exchange,提问作者Atlinx
相关产品推荐
相关产品推荐

