📌  相关文章
📜  订阅字段必须返回 Async Iterable.收到:未定义. - Javascript(1)

📅  最后修改于: 2023-12-03 14:57:35.554000             🧑  作者: Mango

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

在使用 JavaScript 开发 GraphQL API 时,我们可以定义订阅字段来处理实时数据推送。订阅字段的返回类型必须是 Async Iterable,这样客户端才能通过订阅来接收实时数据更新。

问题描述

当尝试定义一个订阅字段,但返回类型为未定义时,我们会收到一个错误:订阅字段必须返回 Async Iterable. 收到:未定义.

这个错误通常由于忘记或错误地定义了订阅字段的返回类型而引起。订阅字段必须返回一个表示异步可迭代对象的类型,以便客户端能够正确地接收实时数据更新。

解决方案

要解决此问题,我们需要确保订阅字段的返回类型正确定义为 Async Iterable。以下是一些解决该问题的方法:

1. 使用 GraphQL 类型系统定义返回类型

在 GraphQL 中,我们可以使用类型系统来定义返回类型。确保订阅字段的返回类型是 Async Iterable

const { PubSub } = require('graphql-subscriptions');
const pubsub = new PubSub();

const typeDefs = `
  type Subscription {
    realTimeUpdates: String
  }
`;

const resolvers = {
  Subscription: {
    realTimeUpdates: {
      subscribe: () => pubsub.asyncIterator('REAL_TIME_UPDATES'),
      resolve: (payload) => payload,
    },
  },
};
2. 使用库提供的帮助函数

如果你使用的是一些流行的 GraphQL 库,如 Apollo Server,它们可能会提供一些帮助函数来定义订阅字段的返回类型。使用这些帮助函数可以避免手动定义类型,并确保返回类型为 Async Iterable

const { PubSub, withFilter } = require('apollo-server');

const pubsub = new PubSub();

const typeDefs = `
  type Subscription {
    realTimeUpdates: String
  }
`;

const resolvers = {
  Subscription: {
    realTimeUpdates: {
      subscribe: () => pubsub.asyncIterator('REAL_TIME_UPDATES'),
      resolve: (payload) => payload,
    },
  },
};
3. 接收实时数据更新

一旦你正确定义了订阅字段的返回类型,客户端就可以通过订阅来接收实时数据更新。

subscription {
  realTimeUpdates
}
结论

在 JavaScript 中使用 GraphQL 开发实时数据推送功能时,我们必须确保订阅字段的返回类型是 Async Iterable。这个问题通常是由于返回类型未定义而引起的错误。通过正确定义返回类型,并使用相应的订阅方法,我们可以实现实时数据的订阅与推送。