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

How to use middleware that requires socket connection?

我正在使用 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 上添加一个偶数侦听器,这一点都不好。

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;