如何使用云端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); }); });` 

还附加了来自Firebase的错误日志

@Bob斯奈德是在正确的轨道上。 但是,当你使用Web钩子时,Slack期望某些事情。

当您向webhook发送POST请求时,需要满足以下条件:

  • Content-Type必须是application/json
  • 请求正文必须格式正确的JSON。
  • 请求主体必须包含以下字段之一: textfallbackattachments

现在,当您将数据存储在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); }); }); 
    Interesting Posts