You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Cloud Pub/Sub触发的云函数中发布Pub/Sub消息及错误修复

错误原因

你遇到的PubSub is not a constructor报错核心是版本不匹配的导入语法问题:@google-cloud/pubsub在1.0.0版本才调整为支持ES6解构导出PubSub类,你当前使用的0.18.0版本属于更早的版本,不支持const { PubSub } = require("@google-cloud/pubsub")这种写法。同时安装两个版本的依赖只会引发模块冲突,无法解决问题。


方案一:保留0.18.0版本的修复方法

  • 修正导入语句,不要使用解构导入
  • 实例化PubSub客户端时传入项目ID参数
  • 补全异步调用的await,避免云函数提前终止导致消息发布未完成

修正后的代码:

// 老版本导入不需要解构
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);
    // 调用异步方法加await
    await sendPubSubMessage(messageObjectData);
  } catch (error) {
    console.log(error.message);
  }
};

async function sendPubSubMessage(
  messageObjectData,
  topicName = "projects/myproject/topics/mytopic",
  data = JSON.stringify(messageObjectData)
) {
  // 老版本实例化需要传入项目ID
  const pubSubClient = new PubSub({
    projectId: '你的实际项目ID'
  });
  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;
  }
}

package.json保持原有0.18.0版本依赖即可。


方案二:升级到2.18.3版本的修复方法

你升级后无法部署大概率是云函数运行时版本过低,2.18.3要求Node.js运行时版本≥12,只要在云函数配置里把运行时调整为Node.js 12或更高版本即可正常部署。

修正后的代码:

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);
    await sendPubSubMessage(messageObjectData);
  } catch (error) {
    console.log(error.message);
  }
};

async function sendPubSubMessage(
  messageObjectData,
  topicName = "projects/myproject/topics/mytopic",
  data = JSON.stringify(messageObjectData)
) {
  const pubSubClient = new PubSub();
  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;
  }
}

对应的package.json配置:

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

内容的提问来源于stack exchange,提问作者Caio César P. Ricciuti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:15:02