【问题标题】:如何从由 Cloud Pub/Sub 触发的 Cloud Function 发布 pub/sub 消息
【发布时间】:2022-01-01 19:22:47
【问题描述】:

希望你们都平安!我需要一些关于 Cloud Pub/Sub 触发的云功能的帮助...

我有一个由我的主题之一触发的云功能。我想通过这条消息向另一个主题发送一条新消息,但我遇到了一些错误。

我的功能:

const { PubSub } = require("@google-cloud/pubsub");

exports.helloPubSub = async (message, context) => {
  try {
    let messageData = Buffer.from(message.data, "base64").toString();
    let messageObjectData = JSON.parse(messageData);

    //send pub/sub message to another topic
    sendPubSubMessage(messageObjectData);
  } catch (error) {
    console.log(error.message);
  }
};

function sendPubSubMessage(
  messageObjectData,
  topicName = "projects/myproject/topics/mytopic",
  data = JSON.stringify(messageObjectData)
) {
  const pubSubClient = new PubSub();

  async function publishMessage() {
    const dataBuffer = Buffer.from(data);

    try {
      const messageId = await pubSubClient.topic(topicName).publish(dataBuffer);
      console.log(`Message ${messageId} published.`);
    } catch (error) {
      console.error(`Received error while publishing: ${error.message}`);
      process.exitCode = 1;
    }
  }

  publishMessage();
}

包.json:

{
  "name": "sample-pubsub",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/pubsub": "^0.18.0"
  }
}

当这个函数运行时,我得到这个错误: ERROR: PubSub is not a constructor

我尝试将依赖版本更改为最后一个2.18.3,但是它没有部署...

我也尝试加载两个版本:

{
  "name": "sample-pubsub",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/pubsub": "^0.18.0",
    "lastPubSub" : "npm:google-cloud/pubsub@^2.18.3",
  }
}

得到了同样的错误...

有人知道如何解决吗?

提前致谢!

【问题讨论】:

  • 你显然有依赖混淆。我不知道如何在 NodeJS 中解决这个问题,特别是因为当您使用最新版本时,您无法部署,因为您覆盖了内置消息接收器所需的库。如果没有 NodeJS 专家可以回答您,解决方案是使用 HTTP 函数和 PubSub 推送订阅来调用您的函数。
  • 嘿@guillaumeblaquiere,谢谢你的评论!你认为我使用任何其他语言会遇到同样的问题吗?谢谢!
  • 有可能,是的。我不知道是哪一个,但是如果用于接收消息的依赖项与发布消息的依赖项的版本不同,那么您的依赖项就会发生冲突和混乱。
  • Juuuuust 试试看……试试new PubSub({<project_id>});。我不是 100% 确定节点中的 PubSub 对象有一个默认构造函数(我个人是一个 Python 人)。

标签: google-cloud-functions google-cloud-pubsub


【解决方案1】:

谢谢大家的cmets,终于明白了……

解决方案:

package.json:

{
  "name": "sample-pubsub",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/pubsub": "^0.18.0",
    "googlePub": "npm:@google-cloud/pubsub@^2.18.3"
  }
}

【讨论】: