如何使用云功能将firebase数据发送到松弛状态?

时间:2017-05-26 01:58:25

标签: node.js firebase firebase-realtime-database slack google-cloud-functions

我克隆了这个样本minimal-webhook并使其正常工作。我想通过将写入发送到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);
  });
});`

Also attached the error log from Firebase

2 个答案:

答案 0 :(得分:2)

@Bob Snyder走在正确的轨道上。但是,当您使用Web挂钩时,Slack会指望某些事情。

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

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

现在,当您在firebase上存储数据时,您可以将所需的所有信息存储在数据库中,或者您可以将常用内容保存在代码中,并仅将有效负载(您要发送的数据)放入数据库中。

以下代码段将允许您在数据库中的指定位置存储您想要的任何内容。存储在那里的数据将作为Web挂钩的文本参数以JSON格式传输。

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()事件的类型。删除数据时向Slack发送请求没有意义(使用if (!event.data.exists()) { /* data was deleted */ return; }),您可能也只想发送一次请求(使用if (event.data.previous.exists()) { /* data has been updated */ return; })。

如果您希望消息看起来更好,可以在https://api.slack.com/docs/messages/builder找到有关格式化text字段的信息

答案 1 :(得分:1)

使用body: event.data.val()代替body: event.data.toJSON。您还需要json: true。为失败添加catch()

数据应至少包含属性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);
  });
});