Pub/Sub:似乎无法让本地模拟器与 Node.js 一起工作

Kar*_*son 6 google-app-engine node.js google-cloud-platform google-cloud-pubsub

我在以下链接中读到,我必须使用以下命令在本地启动一个发布/订阅实例gcloud beta emulators pubsub env-init && gcloud beta emulators pubsub start

https://cloud.google.com/pubsub/docs/emulator

这很好,并且实例已启动并正在运行。

我不明白的是,当我启动 node.js 应用程序时,它似乎没有与这个实例交互。

我能够在没有本地运行的 pub/sub 模拟器实例的情况下进行以下工作:

  const subscription = pubsub.subscription(topicName);
  // Register a listener for `message` events.
  subscription.on('message', (message) => {
    console.log('->', message);
  });
  const results = await pubsub.topic('my-new-topic').publish('my message');
  const messageIds = results[0];
  console.log(`Message ${messageIds[0]} published.`);
Run Code Online (Sandbox Code Playgroud)

我认为它可能会违背我在云上的项目,但是因为我也运行了gcloud beta emulators pubsub env-init它应该使用本地的。如前所述,即使我还没有开始,它似乎也有效。

我想知道我是否误解了它在本地开发中的工作方式。以下是我阅读的内容。

  1. 创建项目
  2. 启用发布/订阅
  3. 下载 SDK 安装并初始化
  4. 在 Node.js 应用程序中安装 NPM 库
  5. 通过设置环境变量 gcloud beta emulators pubsub env-init
  6. 通过以下方式启动本地发布/订阅模拟器 gcloud beta emulators pubsub start
  7. 启动 Node.js 应用程序,观察它的连接、获取主题、发布、订阅等。

我希望谷歌有时只做一个简单的项目符号列表,并使深度阅读成为可选。

这是它的外观:

karl@karl-Dell-Precision-M3800:~/dev/node(dev/feat/setup)$ ps aux | grep pubsub
karl     19538  0.0  0.0   4512   848 pts/1    S+   14:52   0:00 /bin/sh /opt/google-cloud-sdk/bin/gcloud beta emulators pubsub start --verbosity=info
karl     19545  1.2  0.2  88796 32760 pts/1    S+   14:52   0:00 python2 -S /opt/google-cloud-sdk/lib/gcloud.py beta emulators pubsub start --verbosity=info
karl     19570  4.0  0.3 6982280 64888 pts/1   Sl+  14:52   0:00 /usr/lib/jvm/java-8-oracle//bin/java -jar /opt/google-cloud-sdk/platform/pubsub-emulator/lib/cloud-pubsub-emulator-0.1-SNAPSHOT-all.jar --host=localhost --port=8085
Run Code Online (Sandbox Code Playgroud)

Myk*_*lis 0

一般来说,你需要运行

$ gcloud beta emulators pubsub start
$ $(gcloud beta emulators pubsub env-init)
Run Code Online (Sandbox Code Playgroud)

在启动 Node 应用程序之前。

env-init命令将导出一个环境变量 ( PUBSUB_EMULATOR_HOST),该变量将由 Node 应用程序中的 Nodejs PubSub 客户端库自动获取,从而使其连接到模拟器而不是全局 Google Cloud Pubsub。

要验证您的应用程序是否可以看到此变量,您可以添加以下内容:

assert(process.env.PUBSUB_EMULATOR_HOST);
Run Code Online (Sandbox Code Playgroud)

在您创建实例的地方PubSub

注意:

  • pubsub start应该发生在之前env-init,因为后者取决于前者选择的动态端口
  • 定义的环境变量env-init需要注入本地终端,以便您的 Nodejs 应用程序可以看到它。这就是为什么我们需要将其包装在 bash$()语法中。

(不幸的是,通过函数框架使用 PubSub 模拟器测试 Nodejs 推送端点似乎已被破坏,因此根据您与 PubSub 交互的方式,您可能必须调整本地测试策略。其他主题操作似乎按预期工作.)