# @axelspringer/graphql-google-pubsub 中文文档

规范地址：https://npmcn.com/package/%40axelspringer/graphql-google-pubsub/

版本：2\.1\.0
npm 元数据更新时间：2025-11-04T14:54:37.917Z
中文译文更新时间：2026-11-07T15:38:22.687Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40axelspringer/graphql-google-pubsub
原文对照：https://npmcn.com/package/%40axelspringer/graphql-google-pubsub/?lang=original
项目主页：https://github.com/axelspringer/graphql-google-pubsub
源码仓库：https://github.com/axelspringer/graphql-google-pubsub

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：83.8 kB，21 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- 运行依赖：3 个
- 首次发布：2018-03-16T12:57:44.299Z
- 最新版本发布：2020-02-12T17:39:40.935Z
- 近 30 天下载量：7270（2026-10-08 至 2026-11-06，npm 官方下载统计）
- 已发布版本数：18（近 12 个月 0 个）

## 中文简介

一个使用 Google PubSub 的图ql 订阅 PubSub 引擎

## 安装

```sh
npm install @axelspringer/graphql-google-pubsub
```

也可以使用：`pnpm add @axelspringer/graphql-google-pubsub`、`yarn add @axelspringer/graphql-google-pubsub`、`bun add @axelspringer/graphql-google-pubsub`

## README

# 图表ql- google- pubsub

此软件包执行 PubSubEngine 接口 [图ql 订阅](https://github.com/apollographql/graphql-subscriptions) 软件包和新的 AsyncIterator 接口. 它允许您将您的订阅管理器连接到 Google PubSub 机制,以支持 多个订阅管理器实例 .

## 安装

`npm install @axelspringer/graphql-google-pubsub` 或者说 `yarn add @axelspringer/graphql-google-pubsub`

## 使用自动同步器

定义您的图形QL 方案 `Subscription` 类型 :

```graphql
schema {
  query: Query
  mutation: Mutation
  subscription: Subscription
}

type Subscription {
    somethingChanged: Result
}

type Result {
    id: String
}
```

现在,让我们创造一个简单的 `GooglePubSub` 实例:

```javascript
import { GooglePubSub } from '@axelspringer/graphql-google-pubsub';
const pubsub = new GooglePubSub();
```

现在,使用 `pubsub.asyncIterator` 以映射您需要的事件 :

```javascript
const SOMETHING_CHANGED_TOPIC = 'something_changed';

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: () => pubsub.asyncIterator(SOMETHING_CHANGED_TOPIC),
    },
  },
}
```

> 订阅解析器不是函数,而是对象 `subscribe` 方法,该返回 `AsyncIterable`。 。 。 .

调用方法 `asyncIterator` 会 议 日 程 和 议 程 `GooglePubSub` 实例将订阅提供的专题,并将返回 `AsyncIterator` 与GooglePubSub实例捆绑在一起,并听取有关该主题的任何活动. 现在 GraphQL 引擎知道 `somethingChanged` 是一个订阅, 每次我们将使用 `pubsub.publish` 关于这一主题 `GooglePubSub` 将 `PUBLISH` 将事件发送到GraphQL `next` graphQL 引擎给出的回调 .

```js
pubsub.publish(SOMETHING_CHANGED_TOPIC, { somethingChanged: { id: "123" }});
```

话题不会自动创建,必须事先创建.

如果您发布非字符串数据, 它会被字符串化, 你必须 [解析收到的信件数据](https://npmcn.com/package/%40axelspringer/graphql-google-pubsub/#readme-receive-messages)。 。 。 .

## 接收信件

这个 [收到消息](https://googleapis.dev/nodejs/pubsub/1.1.5/Message.html) 从Google PubSub作为有效载荷直接传递到分辨率/过滤器函数.

您可以提取那里的数据( Buffer) 或使用 [普通信件处理器](https://npmcn.com/package/%40axelspringer/graphql-google-pubsub/#readme-commonmessagehandler) 以转换收到的消息.

```javascript
function commonMessageHandler ({attributes = {}, data = ''}) {
  return {
    ...attributes,
    text: data.toString()
  };
}
```

这个 `can use custom message handler` 测试可以显示普通信件处理器的灵活性.

## 动态使用基于订阅参数的查询主题 :

```javascript
export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: (_, args) => pubsub.asyncIterator(`${SOMETHING_CHANGED_TOPIC}.${args.relevantId}`),
    },
  },
}
```

## 使用参数和有效载荷过滤事件

```javascript
import { withFilter } from 'graphql-subscriptions';

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: withFilter(
        (_, args) => pubsub.asyncIterator(`${SOMETHING_CHANGED_TOPIC}.${args.relevantId}`),
        (payload, variables) => payload.somethingChanged.id === variables.relevantId,
      ),
    },
  },
}
```

## 创建 Google PubSub 客户端

```javascript
import { GooglePubSub } from '@axelspringer/graphql-google-pubsub';

const pubSub = new GooglePubSub(options, topic2SubName, commonMessageHandler)
```

### 选项

这些是 [选项](https://googleapis.dev/nodejs/pubsub/1.1.5/global.html#ClientConfig) 被传递给内部或通过Google PubSub客户端. 如果提供,客户端将从环境变量中提取证书,项目名称等. 看看这个 [认证指南](https://cloud.google.com/docs/authentication/getting-started) 更多信息. 否则您可以在选项中提供此细节 .

```javascript
const options = {
  projectId: 'project-abc',
  credentials:{
    client_email: 'client@example-email.iam.gserviceaccount.com',
    private_key: '-BEGIN PRIVATE KEY-\nsample\n-END PRIVATE KEY-\n'
  }
};
```

#### 订阅选项

[订阅选项](https://googleapis.dev/nodejs/pubsub/1.1.5/global.html#CreateSubscriptionRequest) 可以传入 `subscribe` 或者说 `asyncInterator`。 。 。 .

说明: [(原始内容存档于2017-10-29). google.protobuf. 会期](https://googleapis.dev/nodejs/pubsub/1.1.5/google.protobuf.html#.Duration) 类型必须作为具有一秒属性的对象相传(`{ seconds: 123 }`) (中文(简体) ).

```javascript
const dayInSeconds = 60 * 60 * 24;

const subscriptionOptions = {
  messageRetentionDuration: { seconds: dayInSeconds },
  expirationPolicy: {
    ttl: { seconds: dayInSeconds * 2 }, // 2 Days
  },
};

await pubsub.asyncIterator("abc123", subscriptionOptions);
```

### 专题2SubName

允许构建不同的工作流程. 如果您在多个服务器实例中听到同一订阅, 信件将会在它们之间分发 . 大多数时候,您想要每个服务器不同的订阅. 这样每个服务器实例都可以告知客户端新的消息.

```javascript
const topic2SubName = topicName => `${topicName}-${serverName}-subscription`
```

### 普通信使汉德勒

普通消息处理器随从Google PubSub收到的消息被调用. 您可以在消息传递给订阅者的个人过滤/解析方法之前将消息转换. 举例来说,这样可以注射一种 [数据记录器](https://github.com/facebook/dataloader) 用于所有过滤/解析方法.

```javascript
const getDataLoader = () => new DataLoader(...);
const commonMessageHandler = ({attributes: {id}, data}) => ({id, dataLoader: getDataLoader()});
```

```javascript
export const resolvers = {
  Subscription: {
    somethingChanged: {
      resolve: ({id, dataLoader}) => dataLoader.load(id)
    },
  },
}
```

## 作者

[乔纳斯·哈肯伯格 - 乔纳斯-阿尔库尔帕](https://github.com/jonas-arkulpa)

## 鸣谢

这个项目的灵感主要来自 [图克l- redis 订阅](https://github.com/davidyaha/graphql-redis-subscriptions)。 。 。 . 非常感谢其作者的作品和灵感。 多亏了精益队[丹尼尔·沃格尔](https://github.com/herr-vogel), (中文(简体) ), [马丁·托马斯](https://github.com/mthomas87), (中文(简体) ), [马塞尔多纳](https://github.com/mdohnal), (中文(简体) ), [弗洛里安·塔兹克](https://github.com/pferdone), (中文(简体) ), [塞巴斯蒂安·赫林格](https://github.com/kommander), (中文(简体) ), [Mircea Craculeac 维基百科](https://github.com/emzaeh) 财务报告和审定财务报表 [蒂姆·苏萨](https://github.com/TimSusa)) (中文(简体) ).

## 常见问题

### @axelspringer/graphql-google-pubsub 是什么？

一个使用 Google PubSub 的图ql 订阅 PubSub 引擎

### 如何安装 @axelspringer/graphql-google-pubsub？

在项目目录运行 npm install @axelspringer/graphql-google-pubsub，或使用 pnpm add / yarn add / bun add。

### @axelspringer/graphql-google-pubsub 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/axelspringer\_\_graphql-google-pubsub 是否存在。

### @axelspringer/graphql-google-pubsub 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @axelspringer/graphql-google-pubsub 可以商用吗？

@axelspringer/graphql-google-pubsub 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @axelspringer/graphql-google-pubsub 的下载量有多少？

根据 npm 官方下载统计，@axelspringer/graphql-google-pubsub 在 2026/10/08 – 2026/11/06 这 30 天内被下载 7,270 次，日均约 242 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @axelspringer/graphql-google-pubsub 还在维护吗？

最新版本 2\.1\.0 发布于 2020/02/13（6 年前）；至今共发布 18 个版本，其中过去 12 个月发布了 0 个；首次发布于 2018/03/16。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

