我克隆了这个样本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);
});
});`
答案 0 :(得分:2)
@Bob Snyder走在正确的轨道上。但是,当您使用Web挂钩时,Slack会指望某些事情。
当您向webhook发送POST请求时,需要满足以下条件:
Content-Type
必须为application/json
text
,fallback
或attachments
。现在,当您在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);
});
});