如何使用云端function发送Firebase数据
我克隆了这个示例minimal-webhook,并得到这个工作。 我想通过发送写入松弛来扩展此function。
我正在使用slack的传入webhook。 我想这个问题是如何在nodejs中添加数据有效载荷的方式。 谁能帮忙? 提前致谢。 附加我的代码和错误日志从firebase。
const functions = require('firebase-functions'); const request = require('request-promise'); const WEBHOOK_URL = 'https://hooks.slack.com/services/abc' var headers = { 'Content-type': 'application/json' }; exports.webhook = functions.database.ref('/hooks/{hookId}').onWrite(event => { return request({ uri: WEBHOOK_URL, method: 'POST', headers: headers, body: event.data.toJSON, resolveWithFullResponse: true }).then(response => { if (response.statusCode >= 400) { throw new Error(`HTTP Error: ${response.statusCode}`); } console.log('SUCCESS! Posted', event.data.ref); }); });`
@Bob斯奈德是在正确的轨道上。 但是,当你使用Web钩子时,Slack期望某些事情。
当您向webhook发送POST请求时,需要满足以下条件:
-
Content-Type
必须是application/json
- 请求正文必须格式正确的JSON。
- 请求主体必须包含以下字段之一:
text
,fallback
或attachments
。
现在,当您将数据存储在Firebase中时,可以将所有需要的信息存储在数据库中,也可以将通用内容保存在代码中,并只将有效负载(要发送的数据)放入数据库中。
以下代码片段将允许您在数据库的指定位置存储任何您想要的内容。 存储在那里的数据将以JSON格式作为Web钩子的文本参数传输。
exports.webhook = functions.database.ref('/hooks/{hookId}').onWrite(event => { var body = { "channel": "#general", "username": "your-bot-name-here", "icon_emoji": ":computer:", "text": event.data.toJSON() }; return request({ uri: WEBHOOK_URL, method: 'POST', body: body, json: true, resolveWithFullResponse: true }).then(response => { if (response.statusCode >= 400) { throw new Error(`HTTP Error: ${response.statusCode}`); } console.log('SUCCESS! Posted', event.data.ref); }); });
注意:函数toJSON()
是由Firebase的DataSnapshot
类(其中event.data
是一个实例)添加的。 如果使用不同的对象,则可以使用JSON.stringify(obj)
来实现相同的结果。
你也应该考虑检查onWrite()
事件的types。 当数据被删除时(使用if (!event.data.exists()) { /* data was deleted */ return; }
),向Slack发送请求没有任何意义,您也可能只想发送一次请求(使用if (event.data.previous.exists()) { /* data has been updated */ return; }
)。
如果您希望使消息看起来更好,可以在https://api.slack.com/docs/messages/builderfind关于格式化text
字段的信息
使用body: event.data.val()
而不是body: event.data.toJSON
。 你还需要json: true
。 添加catch()
失败。
数据应至less包括属性text
:
{ "text": "Hello World!" }
更新的代码:
exports.webhook = functions.database.ref('/hooks/{hookId}').onWrite(event => { return request({ uri: WEBHOOK_URL, method: 'POST', headers: headers, body: event.data.val(), // <= CHANGED json: true, // <= ADDED resolveWithFullResponse: true }).then(response => { if (response.statusCode >= 400) { throw new Error(`HTTP Error: ${response.statusCode}`); } console.log('SUCCESS! Posted', event.data.ref); }) .catch(err => { // <= ADDED console.log('FAILED err=', err); }); });