node.js - 发布/订阅 : Can't seem to get local emulator working with Node. js

标签 node.js google-app-engine google-cloud-platform google-cloud-pubsub

我在以下链接中读到,我必须使用以下命令在本地启动一个 pub/sub 实例: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.`);

我认为它可能会影响我在云上的项目,但是因为我也运行了 gcloud beta emulators pubsub env-init它应该使用本地的。如前所述,即使我没有启动它,它似乎也能正常工作。

我想知道我是否误解了它在本地开发中的工作方式。以下是我读到的。
  • 创建项目
  • 启用发布/订阅
  • 下载SDK安装并初始化
  • 在 Node.js 应用程序中安装 NPM 库
  • 通过 gcloud beta emulators pubsub env-init 设置环境变量
  • 通过 gcloud beta emulators pubsub start 启动本地发布/订阅模拟器
  • 启动 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
    

    最佳答案

    一般来说,你需要运行

    $ gcloud beta emulators pubsub start
    $ $(gcloud beta emulators pubsub env-init)
    

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

    要验证您的应用程序是否看到此变量,您可以添加如下内容:
    assert(process.env.PUBSUB_EMULATOR_HOST);
    

    在您创建 PubSub 的地方实例。

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

  • (不幸的是,似乎测试 Nodejs push endpoints with the PubSub emulator via functions-framework is broken ,因此根据您与 PubSub 交互的方式,您可能必须调整本地测试策略。其他主题操作似乎按预期工作。)

    关于node.js - 发布/订阅 : Can't seem to get local emulator working with Node. js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44306324/

    相关文章:

    jquery - 如何将具有共享依赖项的多个 TypeScript 文件编译为单个 JavaScript 文件?

    json - 如何读取 json 文件并将条目保存到 mongodb

    python - 如何在 Windows 上安装 Python ssl 模块?

    google-app-engine - 获取全部 : keys and entities guaranteed to be in same order?

    php - Google Cloud Storage 上传错误 - strpos() : Empty needle

    google-compute-engine - Google Container Engine Kubernetes服务LoadBalancer是否将流量发送到无响应的主机?

    python - 在谷歌云存储上保存模型历史

    google-cloud-platform - BigQueryIO - 不能将 DynamicDestination 与 CREATE_IF_NEEDED 一起用于无界 PCollection 和 FILE_LOADS

    node.js - 为什么我应该在 Google Nodejs 客户端库的 Actions 中使用dialogflow() 而不是 actionssdk()

    javascript - 错误 "Your cache folder contains root-owned files, due to a bug in previous versions of npm"而 "npx create-react-app example_app"