如何使用需要套接字连接的中间件?

我正在使用express.io并试图制作一个需要通过两个套接字连接到远程服务器的中间件。 但是,我有一个问题。

 var net = require('net'); module.exports = function (host, port) { return function (req, res, next) { req._messages = net.connect(port, host); req._commands = net.connect(port, host); req._messages.on('data', function (data) { req.io.broadcast('data', data.toString('ascii')); }); req._messages.write('CF I\r'); // initialization command next(); } } 

然后在我的主要应用程序:

 var port = process.env.CYLON_PORT; var host = process.env.CYLON_HOST; var app = require('express.io').http().io(); app.use(require('./cylon/controller')(host, port)); module.exports = app; 

但是,我遇到了一个问题。 在每个请求上,它尝试重新连接。 这会导致Error: connect ECONNREFUSED 。 理想情况下,我希望在应用程序启动时连接一次,并维护该套接字,但需要拦截每个连接。

我如何在中间件中使用套接字?

你可以尝试这种方式:

 var net = require('net'); module.exports = function (host, port) { var messagesConnection = net.connect(port, host); var commandsConnection = net.connect(port, host); return function (req, res, next) { req._messages = messagesConnection; req._commands = commandsConnection; req._messages.on('data', function (data) { req.io.broadcast('data', data.toString('ascii')); }); req._messages.write('CF I\r'); // initialization command next(); } } 

require('./cylon/controller')(host, port)的调用将启动连接,每当中间件被调用时它们将被重用。

编辑 :我想知道你是否真的需要设置你req对象上的所有这些新的领域。 你可能有一些文件,例如导出iomessagesConnectioncommandsConnection ,你可以在需要的时候需要它们。

在这里,每当中间件被调用时,最终都会在messagesConnection上添加一个甚至是监听器,这是一切,但是很好。

编辑2 :你可以做什么,因为你似乎使用express-io

 var net = require('net'); module.exports = function (io, host, port) { var messagesConnection = net.connect(port, host); var commandsConnection = net.connect(port, host); messagesConnection.on('data', function (data) { io.broadcast('data', data.toString('ascii')); }); messagesConnection.write('CF I\r'); // initialization command return function (req, res, next) { req._messages = messagesConnection; req._commands = commandsConnection; next(); } } 

并在您的主文件中:

 var port = process.env.CYLON_PORT; var host = process.env.CYLON_HOST; var app = require('express.io').http().io(); app.use(require('./cylon/controller')(app.io, host, port)); module.exports = app;