NodeJS Express 框架多次读取同一个事件
NodeJS express framework reads the same event multiple times
我正在使用一项服务 (WSO2CEP),该服务将事件发送到我开发的节点 js 程序,我们称它为 receiver.js,然后它将这些事件存储在 mongo 数据库中. WSO2CEP 和 receiver.js 之间的通信是通过 HTTP 连接完成的。我面临的问题是,当 WSO2 发送一个事件时,receiver.js 捕获它并将其存储在数据库中,并且在一些 seconds/minutes 之后,它检测到一个新事件已经到来,这是不正确的,并将其再次存储在数据库中。第二个事件与第一个相同。
当我看到时,我认为问题出在 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();
}
}
我怀疑事件被存储在一个队列(或类似队列)中并且每隔一段时间就会被重新传输。对此有什么想法吗?谢谢
查看你的代码,我根本看不出你在使用响应对象。在你调用 this.emit('event', event);
之后,你应该调用类似 res.status(201).end();
的东西,它会将 HTTP 状态 201 发送回调用客户端。
因为您没有在响应对象上设置任何信息,您的应用程序挂起并且没有对 HTTP 调用做出响应。因此,像 nginx 或 apache 这样的东西是 re-issuing 在特定超时后对您的应用程序的请求。
如果您明确地使用某些内容创建响应 res.status(201).end();
那么您的请求将正确结束并且不会进行重复调用。
我正在使用一项服务 (WSO2CEP),该服务将事件发送到我开发的节点 js 程序,我们称它为 receiver.js,然后它将这些事件存储在 mongo 数据库中. WSO2CEP 和 receiver.js 之间的通信是通过 HTTP 连接完成的。我面临的问题是,当 WSO2 发送一个事件时,receiver.js 捕获它并将其存储在数据库中,并且在一些 seconds/minutes 之后,它检测到一个新事件已经到来,这是不正确的,并将其再次存储在数据库中。第二个事件与第一个相同。
当我看到时,我认为问题出在 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();
}
}
我怀疑事件被存储在一个队列(或类似队列)中并且每隔一段时间就会被重新传输。对此有什么想法吗?谢谢
查看你的代码,我根本看不出你在使用响应对象。在你调用 this.emit('event', event);
之后,你应该调用类似 res.status(201).end();
的东西,它会将 HTTP 状态 201 发送回调用客户端。
因为您没有在响应对象上设置任何信息,您的应用程序挂起并且没有对 HTTP 调用做出响应。因此,像 nginx 或 apache 这样的东西是 re-issuing 在特定超时后对您的应用程序的请求。
如果您明确地使用某些内容创建响应 res.status(201).end();
那么您的请求将正确结束并且不会进行重复调用。