Javascript 实现Slack命令延迟响应
我构建了一个slackslash命令,该命令与自定义节点API通信,并以某种方式、形状或形式发布首字母缩写数据。它要么获取首字母缩写词的含义,要么向Mongo数据库添加/删除新的首字母缩写词 到目前为止,该命令运行良好,但Slack偶尔会返回超时错误,因为它希望在3秒内得到响应。因此,我试图实现延迟响应我不确定我是否为Slack slash命令和节点API正确实现了延迟响应。 有关于延迟响应的信息。我的想法是,我想立即发送一个200响应,让空闲用户知道他们的请求已被处理。然后我想向Javascript 实现Slack命令延迟响应,javascript,node.js,heroku,slack-api,Javascript,Node.js,Heroku,Slack Api,我构建了一个slackslash命令,该命令与自定义节点API通信,并以某种方式、形状或形式发布首字母缩写数据。它要么获取首字母缩写词的含义,要么向Mongo数据库添加/删除新的首字母缩写词 到目前为止,该命令运行良好,但Slack偶尔会返回超时错误,因为它希望在3秒内得到响应。因此,我试图实现延迟响应我不确定我是否为Slack slash命令和节点API正确实现了延迟响应。 有关于延迟响应的信息。我的想法是,我想立即发送一个200响应,让空闲用户知道他们的请求已被处理。然后我想向slackRe
slackReq.response\u url
发送一个不受3秒时间限制的延迟响应
代码
let jwt = require('jsonwebtoken');
let request = require('request');
let slackHelper = require('../helpers/slack');
// ====================
// Slack Request Body
// ====================
// {
// "token":"~",
// "team_id":"~"
// "team_domain":"~",
// "channel_id":"~",
// "channel_name":"~",
// "user_id":"~",
// "user_name":"~",
// "command":"~",
// "text":"~",
// "response_url":"~"
// }
exports.handle = (req, res) => {
let slackReq = req.body;
let token = slackReq.token;
let teamId = slackReq.team_id;
if (!token || !teamId || !slackHelper.match(token, teamId)) {
// Handle an improper Slack request
res.json({
response_type: 'ephemeral',
text: 'Incorrect request'
});
} else {
// Handle a valid Slack request
slackHelper.handleReq(slackReq, (err, slackRes) => {
if (err) {
res.json({
response_type: 'ephemeral',
text: 'There was an error'
});
} else {
// NOT WORKING - Immediately send a successful response
res.json({
response_type: 'ephemeral',
text: 'Got it! Processing your acronym request...'
})
let options = {
method: 'POST',
uri: slackReq.response_url,
body: slackRes,
json: true
};
// Send a delayed response with the actual acronym data
request(options, err => {
if (err) console.log(err);
});
}
});
}
};
现在发生了什么
说我想找到缩写词NBA的意思。我继续懈怠,并提出以下建议:
/缩写NBA
然后我点击了3秒超时错误-Darn–该斜杠命令不起作用(错误消息:已达到超时)。在斜杠命令处管理命令
我再发送几次请求(2到4次),然后API最终立即返回:
明白了!正在处理您的首字母缩写请求…
NBA的意思是“国家篮球协会”。
我想发生的事
我继续懈怠,并提出以下建议:
/缩写NBA
我立即得到以下信息:
明白了!正在处理您的首字母缩写请求…
然后,在3秒钟的窗口之外,我得到以下结果:
NBA的意思是“国家篮球协会”。
我从来没有遇到过超时错误
结论
我做错了什么?由于某些原因,带有处理消息的res.json()
不会立即返回。我能做些什么来解决这个问题
提前谢谢你
编辑1
我试图用res.sendStatus(200).json()
替换res.json()
调用,但不幸的是,它只返回了一个“OK”,而没有实际处理请求
我随后尝试了res.status(200).send({..stuff..})
,但这导致了我以前遇到的相同问题
我认为res.json()
会自动发送一个200,但由于某些原因,它的响应速度不够快
解决方案
我终于想出了这个办法。我一直在实施延迟响应
因为我使用的是Heroku的免费计划,所以托管我应用程序的dyno会在30分钟的不活动后停止运行。当应用程序关闭时,最初的几个请求将在正确响应请求之前暂停
解决方案是1)升级到一个新计划,使dyno始终处于活动状态,或2)每隔15分钟左右通过一个简单的get请求ping应用程序,如下所示:
const intervalMins = 15;
setInterval(() => {
http.get("<insert app url here>");
console.log('Ping!');
}, intervalMin * 60000)
const intervalMins=15;
设置间隔(()=>{
http.get(“”);
console.log('Ping!');
},最小间隔*60000)
我决定选择后者。我再也不会碰到迪诺睡觉的问题了。我想了解更多细节 你试过这个吗<代码>res.sendStatus(200)代码>。应该根据答案来做。我现在就试试。复制问题需要一段时间不使用API(有趣的是…),因此我将根据成功和失败添加另一条注释,然后用我尝试过的代码更新帖子。@ErikKalkoken很遗憾,这不起作用,但感谢您的建议。见上面的编辑1。