【问题标题】:Graphql subscriptions - Subscription field must return Async Iterable. Received: undefined when using withFilterGraphql 订阅 - 订阅字段必须返回 Async Iterable。收到:使用 withFilter 时未定义
【发布时间】:2020-04-04 01:18:23
【问题描述】:

我有一个使用 graphql 订阅来实现聊天功能的应用。我已经成功地让订阅工作了,但是在引入 withFilter 函数以过滤消息发送到哪些客户端之后,我在前端收到以下错误:

订阅字段必须返回 Async Iterable。收到:未定义

这是我的订阅解析器:

const { PubSub, withFilter } = require('graphql-yoga');

const pubsub = new PubSub();
pubsub.ee.setMaxListeners(30);

const Subscription = {
  detailedConversation: withFilter(
    () => pubsub.asyncIterator('detailedConversation'),
    (payload, args) => {
      return true;
    }
  )
};

module.exports = {
  Subscription,
  pubsub
};

由于 withFilter 的第二个参数必须是一个返回布尔值的函数,所以我暂时将其设置为返回 true。

Graphql-yoga 在后台使用了 graphql-subscriptions,在阅读了关于实现 here 的文档后,我看不出我做错了什么?

仅供参考,第一次尝试订阅对话时会发生错误,而不是在发送消息或任何内容时发生

【问题讨论】:

    标签: javascript websocket graphql


    【解决方案1】:

    我知道这个问题很老了,但我会把我的解决方案提供给其他可能会寻找完全相同的解决方案的人......

    首先要注意的是,我使用的是graphql-redis-subscriptions 实现而不是默认实现。

       userUpdated: {
            subscribe: withFilter((_, args, { pubsub }) => pubsub.asyncIterator('userUpdated'), (payload, vars) => vars.usersId.includes(payload.userUpdated.id))
        }
    

    documentation link

    【讨论】:

      【解决方案2】:

      您只需检查两个参数是否相同,然后返回您的操作。

      UserUpdated:{
          withFilter(
              () => pubsub.asyncIterator('UserUpdated'),
              (payload, variables) => {            
                  return (payload.UserUpdated.id === variables.channelid);
              },
          ),
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-06
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 2021-03-17
        • 2021-05-21
        • 2018-10-19
        • 2020-08-12
        • 1970-01-01
        相关资源
        最近更新 更多