我正在使用 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
对象上设置所有这些新字段。例如,您可以拥有一些导出 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;
关于javascript - 如何使用需要套接字连接的中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942491/