slack events api通过一条消息多次触发
Posted
技术标签:
【中文标题】slack events api通过一条消息多次触发【英文标题】:slack events api triggers multiple times by one message 【发布时间】: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
【参考方案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 个事件。
【讨论】:
以上是关于slack events api通过一条消息多次触发的主要内容,如果未能解决你的问题,请参考以下文章
除了[消息]之外,如何调用Slack API中的任何其他事件?