我正在使用 Slack API 从 Slack 工作区获取链接。它有效,除非发布消息时它会多次触发。每次。这是我的代码:
exports.slack = (req , res) => {
var message = req.body;
if (message.challenge) {
res.send(message.challenge);
} else if (message.event.type == 'message_received') {
if (message.event.text.includes('<')) {
// Link
console.log('NEW LINK');
var link = message.event.text.slice(1, -1);
getArticleInfo(link, (error, body) => {
if (error)
console.error(error);
else {
newArticleToDB(body , link, req);
}
});
}
}
}
每次发布新消息时,我都会多次收到“新链接”日志。有什么想法可以在哪里寻找这个问题吗?
谢谢。
我添加了
res.sendStatus(200)
,现在一切都按预期进行。这是代码:
exports.slack = (req , res) => {
var message = req.body;
res.sendStatus(200);
if (message.challenge) {
res.send(message.challenge);
} else if (message.event.type == 'message' && message.event.subtype != 'message_changed') {
if (message.event.text && message.event.text.includes('<')) {
// Link
console.log('NEW LINK');
var link = message.event.text.slice(1, -1);
getArticleInfo(link, (error, body) => {
if (error)
console.error(error);
else {
newArticleToDB(body , link, req);
}
});
}
}
我遇到了问题,感谢@taylor-singletary 的建议。 我必须打印
console.log('Request Headers::: ', JSON.stringify(req.headers));
寻找
"x-slack-retry-num":"1"
要获取标头值,只需参考这个问题:How to extract request http headers from a request using NodeJS connect
响应事件
您的应用程序应在三秒内使用 HTTP 2xx 响应事件请求。如果没有,我们将认为事件传递尝试失败。失败后,我们将重试三次,以指数方式回退。一些最佳实践是:
保持每 60 分钟至少 5% 的事件响应成功率,以防止自动禁用。
尽快使用 HTTP 200 OK 响应事件。
避免在同一进程中实际处理事件并做出反应。
实现一个队列来处理收到的入站事件。
您对事件的处理方式取决于您的应用程序或服务的用途。
也许它会触发您使用chat.postMessage发送消息。也许您会更新排行榜。也许您会更新您正在存储的数据。也许你会改变世界,或者只是决定什么也不做。
参考:https://api.slack.com/apis/connections/events-api#graceful_retries
这个方法很有帮助,尽快回复然后继续避免重试
from flask import Flask, request, jsonify
from threading import Thread
app = Flask(__name__)
def process_event(data):
# Your long-running event processing logic here
pass
@app.route('/slack/events', methods=['POST'])
def slack_events():
data = request.json
# Respond immediately
response = jsonify({'status': 'ok'})
# Start a new thread to process the event
thread = Thread(target=process_event, args=(data,))
thread.start()
return response, 200
if __name__ == "__main__":
app.run(port=3000)