我正在使用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
。理想情况下,我希望在应用程序启动时连接一次并维护该套接字,但它需要拦截每个连接。
如何在中间件中使用套接字?
答案 0 :(得分:2)
您可以尝试这种方式:
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
对象上设置所有这些新字段。例如,您可以将一些文件导出io
,messagesConnection
和commandsConnection
,并且可以在需要时提供这些文件。
每次调用中间件时,最终都会在messagesConnection
上添加一个偶数监听器,这一切都很好。
Edit2 :您可以做什么,因为您似乎在使用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;