Node.js 如何使用云函数将firebase数据发送到slack?
我克隆了这个样本,让它工作了。我想通过向slack发送写操作来扩展此功能 我正在使用slack的传入webhook。我想问题在于如何在nodejs中添加数据负载。有人能帮忙吗?提前谢谢。从firebase附加了我的代码和错误日志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
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”}的代码和数据成功地发送消息
。我怀疑您得到的是“无效负载”,因为您的数据不包含文本
属性。