我部署了以下功能:
interface MessageData {
reviewId: string;
}
export const applyPreAssessRules = functions
.pubsub.topic("applyPreAssessRules")
.onPublish(async (message) => {
const { reviewId } = message.json as MessageData;
...
}
云平台GUI提供了一个页面来测试功能,但我不知道如何格式化输入。
我尝试了几种方法,包括:
{"reviewId": "LRuvmv14u7c47IRiravi"}
{"message": {"reviewId": "LRuvmv14u7c47IRiravi"}}
{"message": { "json": {"reviewId": "LRuvmv14u7c47IRiravi"}}}
我一直得到以下输出:
错误:函数执行失败。详细信息:第一个参数必须是string、Buffer、ArrayBuffer、Array或类似Array的Object类型之一。接收类型未定义
我缺少什么?
我已经使用Firebase部署了该功能。不知道这是否有什么不同。。。
事实上@eespinola几乎为您指明了正确的方向。如果你仔细检查他提供的链接,你会发现云功能的默认订阅者片段:
/**
* Triggered from a message on a Cloud Pub/Sub topic.
*
* @param {object} pubsubMessage The Cloud Pub/Sub Message object.
* @param {string} pubsubMessage.data The "data" property of the Cloud Pub/Sub Message.
*/
exports.subscribe = (pubsubMessage) => {
// Print out the data from Pub/Sub, to prove that it worked
console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
};
此代码段显示pubsub事件包含一个名为"data"的字段,该字段是一个base64编码的字符串。此外,如果您搜索PubSub的API文档,您会发现消息的JSON表示的语法:
{
"data": string,
"attributes": {
string: string,
...
},
"messageId": string,
"publishTime": string
}
因此,您需要使用该格式将负载编码为base64字符串,并将其转换回函数中的Javascript对象。