我在以下链接中读到,我必须使用以下命令在本地启动一个 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
它应该使用本地的。如前所述,即使我没有启动它,它似乎也能正常工作。我想知道我是否误解了它在本地开发中的工作方式。以下是我读到的。
gcloud beta emulators pubsub env-init
设置环境变量gcloud beta emulators pubsub start
启动本地发布/订阅模拟器我希望谷歌有时会做一个简单的项目符号列表,并使深度阅读成为可选的。
这是它的外观:
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/