google-cloud-platform - 将消息发布到 PubSub 的云函数(由 HTTP 触发)
问题描述
我正在尝试在 Cloud Function 中创建 HTTP API - 最终发布了一条消息 t PubSub。了解,有 PubSub REST API - 但它强制我设置身份验证(在客户端) - 我想跳过并将其移动到服务器端。
下面的代码使用此命令部署为 Google Cloud Functiongcloud functions deploy helloGET --runtime nodejs8 --trigger-http
但是在浏览器中测试时,它会出错Error: could not handle the request
任何建议表示赞赏,谢谢!
"use strict";
// [START functions_pubsub_setup]
const { PubSub } = require("@google-cloud/pubsub");
// Instantiates a client
const pubsub = new PubSub();
// [END functions_pubsub_setup]
const Buffer = require("safe-buffer").Buffer;
exports.helloGET = (req, res) => {
const topic = pubsub.topic("projects/myproject/topics/openit");
const message = {
data: {
message: "req.body.message"
}
};
// Publishes a message
res.send(
topic
.publish(message)
.then(() => res.status(200).send("Message published."))
.catch(err => {
err = `Catch block ... ${err}`;
console.error(err);
res.status(500).send(err);
return Promise.reject(err);
})
);
};
解决方案
下面的代码将起作用。但是订阅者需要大约 30 秒或更长时间才能收到事件 - 对于我的用例来说太慢了:S
"use strict";
const { PubSub } = require("@google-cloud/pubsub");
const pubsub = new PubSub();
const Buffer = require("safe-buffer").Buffer;
exports.helloGET = async (req, res) => {
var toPublish = `hello ${Date.now()}`;
publishMessage("_REPLACE_WITH_TOPIC_NAME_", toPublish);
res.send(`Published ${toPublish}`);
};
async function publishMessage(topicName, data) {
console.log("=> publishMessage, data = ", data);
const dataBuffer = Buffer.from(data);
const topic = pubsub.topic(topicName);
const publisher = topic.publisher();
publisher.publish(dataBuffer, { a: "XYZ" }, function() {
console.log("Published eventually ...");
});
}
推荐阅读
- java - 正则表达式匹配java中的URL模式
- android - 如何设计这样的群聊
- c - 数组具有不完整的元素类型“布尔”
- amazon-eks - 将安全组附加到 Fargate 配置文件上的 EKS
- angular - Angular Provider useValue over 直接使用常量
- adb - adb push/push 需要一个参数
- ionic-framework - Ionic 5 Modal UI 未绑定到控制器属性
- circleci - 在 CircleCI 上构建 arm64v8 docker
- python - 从数据框中获取每年的最后日期值
- reactjs - 为什么我的子嵌套项目没有保存在拖动位置?