slack events api 一条消息触发多次

问题描述 投票:0回答:5

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

每次发布新消息时,我都会多次收到“新链接”日志。有什么想法可以在哪里寻找这个问题吗?

谢谢。

javascript node.js api express slack-api
5个回答
13
投票

我添加了

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);
            }
        });  
    }
}

12
投票

我遇到了问题,感谢@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


3
投票

我在接收多个事件时遇到了同样的问题。结果我添加的每个机器人用户事件收到 1 个事件。我不知道这是否是 API 的预期行为,但我决定删除除

app_mention
之外的所有事件,现在我只收到 1 个事件。

Subscribe to bot events


1
投票

响应事件

您的应用程序应在三秒内使用 HTTP 2xx 响应事件请求。如果没有,我们将认为事件传递尝试失败。失败后,我们将重试三次,以指数方式回退。一些最佳实践是:

  1. 保持每 60 分钟至少 5% 的事件响应成功率,以防止自动禁用。

  2. 尽快使用 HTTP 200 OK 响应事件。

  3. 避免在同一进程中实际处理事件并做出反应。

  4. 实现一个队列来处理收到的入站事件。

您对事件的处理方式取决于您的应用程序或服务的用途。

也许它会触发您使用chat.postMessage发送消息。也许您会更新排行榜。也许您会更新您正在存储的数据。也许你会改变世界,或者只是决定什么也不做。

参考:https://api.slack.com/apis/connections/events-api#graceful_retries


0
投票

这个方法很有帮助,尽快回复然后继续避免重试

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)
© www.soinside.com 2019 - 2024. All rights reserved.