首页 > 解决方案 > 如何将 Ix AsyncIterator 用于 nest.js GraphQL 订阅

问题描述

我有一个特殊的用例,我想使用 GraphQL 作为现有 WebSocket 服务器的代理。但不知何故,我根本没有让订阅工作。

因为我不能使用 NestJS 附带的 PubSub 东西,所以我得出的结论是,使用 Ix 创建 AsyncIterator 是最简单的。为了证明它完全有效的概念,我将我的代码简化为:

@Resolver((of) => –)
export class TestResolver {
  constructor() {}


  @Subscription((returns) => Number)
  counter(): AsyncIterator<number> {
    return from([1, 2, 3, 4, 5, 6])[Symbol.asyncIterator]();
  }
}


至少应该返回 6 或其他东西。但我的客户抱怨“不能为不可为空的字段 Subscription.counter 返回 null。”

我现在知道这段代码可能有什么问题以及为什么它可能返回 null。

––––</p>

我还尝试使用没有 Ix 的 AsyncIterator,它可能会产生更好的输出,但实际上也会失败并出现相同的错误。

async function* generateSequence(start, end) {
  for (let i = start; i <= end; i++) {
    // Wow, can use await!
    await new Promise((resolve) => setTimeout(resolve, 1000));

    yield i;
  }
}


@Resolver((of) => –)
export class TestResolver {
  constructor() {}


  @Subscription((returns) => Number)
  counter(): AsyncIterator<number> {
    return generateSequence(1, 100);
  }
}


标签: graphqlnestjsapolloapollo-serverixjs

解决方案


推荐阅读