NodeJS express框架多次读取同一事件

时间:2018-03-20 11:56:58

标签: node.js http express wso2

我正在使用一个服务(WSO2CEP),它将事件发送到我开发的节点js程序,让我们称之为receiver.js,然后将这些事件存储在mongo db中。 WSO2CEP和receiver.js之间的通信是通过HTTP连接完成的。我面临的问题是,当WSO2发送一个事件时,receiver.js将其捕获并将其存储在数据库中,几秒钟后,它会检测到新事件已到达,这不是真的,并将其再次存储在数据库中。第二个事件与第一个事件相同。

当我看到我认为问题是WSO2多次发送相同的事件时,但我调试它我100%确定只发送一个事件,所以问题似乎是HTTP连接。

HTTP连接由作为服务器的receiver.js和作为客户端的WSO2处理,它通过HTTP post请求发送事件。 receiver.js中的http服务器实现是使用“express”框架完成的。正如在下面的代码块中可以看到的那样。

'use strict';
const express = require('express');
const bodyParser = require('body-parser');
const EventEmitter = require('events');

const   port = Whatever;


module.exports = class WSO2Server extends EventEmitter {
  constructor () {
    super();
    const   app = express();
    app.use(bodyParser.json());       // to support JSON-encoded bodies

    app.route('/Whatever').post( (req, res) => {
      let event = req.body;
      this.emit('event', event);
    });

    this.server = app.listen(port);
  }

  destroy () {
    this.server.close();
  }
}

我怀疑这些事件存储在一个队列(或类似的)中,并且每隔一段时间就会被重新传输。有什么想法吗?谢谢

1 个答案:

答案 0 :(得分:1)

查看您的代码,我根本看不到您使用响应对象。在您调用this.emit('event', event);之后,您应该调用res.status(201).end();之类的内容,将HTTP状态201发送回主叫客户端。

因为您没有在响应对象上设置任何信息,所以您的应用程序挂起并且没有对HTTP调用做出响应。因此,像nginx或apache这样的东西会在特定超时后重新向您的应用程序发出请求。

如果您使用res.status(201).end();明确创建回复,那么您的请求将正确结束,并且不会进行重复调用。