Express:Post Request处理程序不会停止调用函数

时间:2016-08-10 21:38:57

标签: node.js http express post slack-api

我的快递应用调用一次函数,但在处理POST请求时会反复调用它。我无法弄清楚为什么它是不止一次打电话。

此应用程序与Slack Events API一起使用,并在将消息发布到特定Slack通道时从Slack接收事件作为发布请求。一旦应用程序收到该事件,它将以200状态响应进行响应,以提醒Slack它已收到该事件。然后,应用程序从请求中提取text属性,并使用文本调用postMessage将消息发布到其他通道。将消息发布到其他频道不会启动另一个事件。

问题是postMessage()被无限调用,直到我手动崩溃应用程序

在这里,我设置应用程序并等待发布请求:

const express = require('express');
var bodyParser = require('body-parser');

var app = express();
var jsonParser = bodyParser.json();

// Wait for post requests, then extract it's text
app.post('/', jsonParser, function (req, res) {
  if (!req.body){
    return res.sendStatus(400);
  } else {
    postMessage(req.body.event.text);     //Should be called once
  }

  // Respond to Slack Event API we received their request
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.end();
  });
}

app.listen(config('PORT'), (err) => {
  if (err) throw err
  console.log(`App LIVES on PORT ${config('PORT')}`);
});

请求正文的结构如下:

body = {
  event: {
    text: "important message"
  }
}

不断被调用的函数。这将向Slack频道发布消息:

function postMessage(message){
  var messagePath = 'https://slack.com/api/chat.postMessage?token=xxx&message=' + message;
  request(messagePath, function(error, response, body){
      if (!error && response.statusCode == 200){
          console.log('message sent successfully');
      } else {
          console.log('error == ' + error);
      }
  });
}

使用正确的文本调用postMessage方法。问题是它不止一次被召唤。

我认为Slack的API可能多次发送相同的请求,但是从他们的文档中他们将在发送请求之间等待3秒。我的应用程序将在一秒钟内调用postMessage()大约一百次,所以我不认为Slack的请求超载了

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我的猜测是,你的机器人正在收听发布的消息然后回复这些消息,它在发布时会响应自己。这将导致无限循环。

修复是写一个检查以确保机器人没有响应自己。检查req.body.event并查看是否正在为每条消息发送用户名。然后你可以这样写:

app.post('/', jsonParser, function (req, res) {
    if (!req.body || !req.body.event){
        return res.sendStatus(400);
    } else if (req.body.event.user_name !== '<OUR_USER_NAME>') { // Make sure we are not responding to ourselves
        postMessage(req.body.event.text); // Should be called once
    }

    // Respond to Slack Event API we received their request
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end();
});