如何从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
相关产品推荐
相关产品推荐

