【问题标题】:slack events api triggers multiple times by one messageslack events api通过一条消息多次触发
【发布时间】:2018-11-15 20:14:42
【问题描述】:

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

每次发布​​新消息时,我都会多次收到“新链接”日志。任何想法在哪里寻找这个问题?

谢谢。

【问题讨论】:

  • 有事件ID吗?也许您可以尝试检查收到的事件是否具有与之前的事件不同的事件,例如if(message.event.id != lasteventid){ run even handler },通过 ID 我的意思是某种数字随着每个收到的事件而改变或增加
  • @stetoc 刚刚检查过,当发布一条消息时,每个消息 ID 都不同。所以还是会触发多次。
  • 也许问题出在您在此处作为代码发布的内容之外?也许你多次添加一些处理程序?你检查了吗?
  • @stetoc 是的,我删除了所有 if 语句,只是控制台记录了“消息”,但我仍然收到多个日志。
  • 如果你没有通过某种 HTTP 200 OK 确认请求,那么 Slack 会认为你没有收到它并重试几次请求。见api.slack.com/events-api#graceful_retries

标签: javascript node.js api express slack-api


【解决方案1】:

我添加了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);
            }
        });  
    }
}

【讨论】:

  • 我尝试了res.sendStatus(200),但没有成功。对我来说,res.json({ok:true}); 有效。
【解决方案2】:

我遇到了问题,感谢@taylor-singletary 的建议。 我必须打印

console.log('Request Headers::: ', JSON.stringify(req.headers));

寻找

"x-slack-retry-num":"1"

要获取header值,只需参考这个问题:How to extract request http headers from a request using NodeJS connect

【讨论】:

  • 我认为标题名称是“X-Slack-Retry-Num”
【解决方案3】:

我在接收多个事件时遇到了同样的问题。事实证明,我添加的每个机器人用户事件都会收到 1 个事件。我不知道这是否是 API 的预期行为,但我决定删除除 app_mention 之外的所有事件,现在我只收到 1 个事件。

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2022-01-12
    • 2018-06-02
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多