首页 > 解决方案 > 如何在节点应用程序中使用 prisma graphql 订阅

问题描述

我正在遵循本指南。我正在尝试在我的节点应用程序中收听 graphQL 订阅。我在实施该订阅时遇到了很多麻烦。我尝试了几种不同的方法,如下所列,它们都不起作用。

// converted to rxjs observables
from(PrismaClient.$subscribe.priority({
    mutation_in: "CREATED"
})).subscribe(
    (next) => {
        console.log("next", next);
    },
    () => {
        console.log("error");
    },
    () => {
        console.log("complete");
    }
);

// as promise
PrismaClient.$subscribe.priority({
    mutation_in: "CREATED"
}).then(
    (next) => {
        console.log("next", next);
    }
);

这两个都在下一个返回:

{ next: [Function: next],
  return: [Function: return],
  throw: [Function: throw],
  '@@asyncIterator': [Function] }

我希望它会priority在任何时候创建一个新的时返回。但是,它只返回一次并立即完成并返回我上面列出的那个对象。

我知道这与它返回一个有关Promise<AsyncIterator<...>>,但我不知道如何解决这个问题。

如何在节点应用程序中使用 prisma graphql 订阅prisma-client?我也想将其转换为rxjs而不是使用promises. 我只是更喜欢Observables

标签: typescriptrxjsgraphqlprismaasync-iterator

解决方案


这是一个关于 Promises 和 async/await 的建议:

const main = async () => {
  const subscription = await PrismaClient.$subscribe.priority({
    mutation_in: 'CREATED',
  })
  handleSubscription(subscription)
}

const handleSubscription = async (subscription) => {
  const result = await subscription.next()
  console.log('do stuff with', result.value)

  if (!result.done) {
    console.log('handle again')
    handleSubscription(subscription)
  }
  else {
    console.log('done')
  }
}

main().catch(e => console.error(e))

推荐阅读