Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 实现Slack命令延迟响应_Javascript_Node.js_Heroku_Slack Api - Fatal编程技术网

Javascript 实现Slack命令延迟响应

Javascript 实现Slack命令延迟响应,javascript,node.js,heroku,slack-api,Javascript,Node.js,Heroku,Slack Api,我构建了一个slackslash命令,该命令与自定义节点API通信,并以某种方式、形状或形式发布首字母缩写数据。它要么获取首字母缩写词的含义,要么向Mongo数据库添加/删除新的首字母缩写词 到目前为止,该命令运行良好,但Slack偶尔会返回超时错误,因为它希望在3秒内得到响应。因此,我试图实现延迟响应我不确定我是否为Slack slash命令和节点API正确实现了延迟响应。 有关于延迟响应的信息。我的想法是,我想立即发送一个200响应,让空闲用户知道他们的请求已被处理。然后我想向slackRe

我构建了一个slackslash命令,该命令与自定义节点API通信,并以某种方式、形状或形式发布首字母缩写数据。它要么获取首字母缩写词的含义,要么向Mongo数据库添加/删除新的首字母缩写词

到目前为止,该命令运行良好,但Slack偶尔会返回超时错误,因为它希望在3秒内得到响应。因此,我试图实现延迟响应我不确定我是否为Slack slash命令和节点API正确实现了延迟响应。

有关于延迟响应的信息。我的想法是,我想立即发送一个200响应,让空闲用户知道他们的请求已被处理。然后我想向
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。