Node.js 如何使用云函数将firebase数据发送到slack?

Node.js 如何使用云函数将firebase数据发送到slack?,node.js,firebase,firebase-realtime-database,slack,google-cloud-functions,Node.js,Firebase,Firebase Realtime Database,Slack,Google Cloud Functions,我克隆了这个样本,让它工作了。我想通过向slack发送写操作来扩展此功能 我正在使用slack的传入webhook。我想问题在于如何在nodejs中添加数据负载。有人能帮忙吗?提前谢谢。从firebase附加了我的代码和错误日志 const functions = require('firebase-functions'); const request = require('request-promise'); const WEBHOOK_URL = 'https://hooks.slack.c

我克隆了这个样本,让它工作了。我想通过向slack发送写操作来扩展此功能

我正在使用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);
  });
});`

使用
body:event.data.val()
而不是
body:event.data.toJSON
。您还需要
json:true
。为故障添加一个catch()

数据应至少包括属性
文本

{
  "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);
  });
});
exports.webhook=functions.database.ref('/hooks/{hookId}').onWrite(事件=>{
退货申请({
uri:WEBHOOK_URL,
方法:“POST”,
标题:标题,
正文:event.data.val(),//=400){
抛出新错误(`HTTP错误:${response.statusCode}`);
}
日志('SUCCESS!Posted',event.data.ref);
})
.catch(err=>{/是正确的。但是,Slack在使用web挂钩时需要某些东西

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

  • 内容类型
    必须是
    应用程序/json
  • 请求正文必须正确格式化为JSON
  • 请求正文必须包含以下字段之一:
    文本
    回退
    附件
现在,当您在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)
获得相同的结果

您还应该考虑检查<代码> OnWrute>(/Case>事件)的类型。当数据被删除时,没有必要发送松弛请求(使用<代码>如果(.Ev.Data .IsvsSo)){/*数据被删除*/Read;},并且您可能还希望只发送一次请求(使用<代码>如果(事件.Data .Simult.EngsSo())){/*数据已更新*/return;}


如果您希望使消息看起来更漂亮,您可以在

上找到有关格式化
文本
字段的信息,因此,我替换了body:event.data.val()并添加了json:true。但我仍然得到以下错误StatusCodeError:400-新StatusCodeError的无效负载(/user\u code/node\u modules/request promise/lib/errors.js:26:15)在Request.self.callback(/user\u-code/node\u-modules/Request-promise/lib/RP.js:68:32)at-Request.self.callback(/user\u-code/node\u-modules/Request-promise/node\u-modules/Request/Request.js:188:22)查看我的更新。我刚刚能够使用
{“text”:“Hello World”}的代码和数据成功地发送消息
。我怀疑您得到的是“无效负载”,因为您的数据不包含
文本
属性。