我的快递应用应调用一次函数,但在处理POST请求时会反复调用它。我无法弄清楚为什么它是不止一次打电话。
此应用程序与Slack Events API一起使用,并在将消息发布到特定Slack通道时从Slack接收事件作为发布请求。一旦应用程序收到该事件,它将以200状态响应进行响应,以提醒Slack它已收到该事件。然后,应用程序从请求中提取text属性,并使用文本调用postMessage将消息发布到其他通道。将消息发布到其他频道不会启动另一个事件。
问题是postMessage()被无限调用,直到我手动崩溃应用程序
在这里,我设置应用程序并等待发布请求:
const express = require('express');
var bodyParser = require('body-parser');
var app = express();
var jsonParser = bodyParser.json();
// Wait for post requests, then extract it's text
app.post('/', jsonParser, function (req, res) {
if (!req.body){
return res.sendStatus(400);
} else {
postMessage(req.body.event.text); //Should be called once
}
// Respond to Slack Event API we received their request
res.writeHead(200, {'Content-Type': 'application/json'});
res.end();
});
}
app.listen(config('PORT'), (err) => {
if (err) throw err
console.log(`App LIVES on PORT ${config('PORT')}`);
});
请求正文的结构如下:
body = {
event: {
text: "important message"
}
}
不断被调用的函数。这将向Slack频道发布消息:
function postMessage(message){
var messagePath = 'https://slack.com/api/chat.postMessage?token=xxx&message=' + message;
request(messagePath, function(error, response, body){
if (!error && response.statusCode == 200){
console.log('message sent successfully');
} else {
console.log('error == ' + error);
}
});
}
使用正确的文本调用postMessage方法。问题是它不止一次被召唤。
我认为Slack的API可能多次发送相同的请求,但是从他们的文档中他们将在发送请求之间等待3秒。我的应用程序将在一秒钟内调用postMessage()大约一百次,所以我不认为Slack的请求超载了
提前谢谢!
答案 0 :(得分:1)
我的猜测是,你的机器人正在收听发布的消息然后回复这些消息,它在发布时会响应自己。这将导致无限循环。
修复是写一个检查以确保机器人没有响应自己。检查req.body.event
并查看是否正在为每条消息发送用户名。然后你可以这样写:
app.post('/', jsonParser, function (req, res) {
if (!req.body || !req.body.event){
return res.sendStatus(400);
} else if (req.body.event.user_name !== '<OUR_USER_NAME>') { // Make sure we are not responding to ourselves
postMessage(req.body.event.text); // Should be called once
}
// Respond to Slack Event API we received their request
res.writeHead(200, {'Content-Type': 'application/json'});
res.end();
});