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

标签 javascript node.js sockets express socket.io

我正在使用 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;

关于javascript - 如何使用需要套接字连接的中间件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31942491/

相关文章:

Javascript:js 在事件加载时不执行

javascript - 我如何找到文档数组中等于或大于值的所有值

c - 在C程序中构建docker镜像

c# - TcpListener 常量错误 每个地址只使用一次

c++ - 如何中断epoll_pwait来捕捉信号

javascript - Ember 调用关闭操作

javascript - 动态选择/取消选择事件中的元素并获取数据属性

javascript - D3 版本 5,如何将 Promise 链接到图表构建

node.js - 使用 Nodejs 和 Symfony 2 的 Websockets

javascript - 需要了解表格结构才能抓取网页