【问题标题】:How can I export socket.io connection to another controller如何将 socket.io 连接导出到另一个控制器
【发布时间】:2020-01-01 10:48:27
【问题描述】:

我遇到了一个问题。

我正在工作的 bin 文件中建立 Socket.IO 连接,但谁能告诉我如何将此连接导出到不同的控制器。这是我的 bin 文件代码。

var app = require('../app');
var debug = require('debug')('userservice:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3015');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);
var io = require('socket.io')(server);
io.on('connection', (socket) => {
  console.log('Connection made #######################################################.', socket.id);
  socket.on('disconnect', () => {
    console.log('Connection disconnected @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.', socket.id);
  });
});
/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

【问题讨论】:

  • 请接受正确答案,以便问题得到解决。

标签: node.js socket.io


【解决方案1】:

有很多技术可以用来重用套接字实例,一个简单而简单的方法是创建一个单一的类,以便能够:

  1. 启动套接字实例
  2. 将实例导出到其他模块

socket.js:

let io;

module.exports = {
  init: (server) => {
    io = require('socket.io').listen(server); io.origins('*:*');
    return io;
  },
  get: () => {
    if (!io) {
      throw new Error("socket is not initialized");
    }
    return io;
  }
};

server.js:

const app = require('../app');
const http = require('http');

/**
 * Get port from environment and store in Express.
 */

const port = '3015';
app.set('port', port);

/**
 * Create HTTP server.
 */

const server = http.createServer(app);
const io = require('./socket.js').init(server);

io.on('connection', (socket) => {
  console.log('Connection success', socket.id);
  socket.on('disconnect', () => {
    console.log('Connection disconnected', socket.id);
  });
}

现在您可以在其他模块中使用它了。

const io = require('./socket.js').get();

【讨论】:

  • getio() 是什么意思? const io = require('./socket.js').getio();
  • @AmineZel 感谢指点,可能有误,已编辑答案
【解决方案2】:

您可以创建一个 socket.io 控制器模块,导出一个您为每个新连接调用的函数。

因此,在您当前的服务器文件中,添加以下内容:

const {socketConnected} = require('socketController.');

并且,您修改此部分以为每个新套接字调用它:

var server = http.createServer(app);
var io = require('socket.io')(server);
io.on('connection', (socket) => {
  console.log('Connection made #######################################################.', socket.id);
  // tell controller about new socket (and pass the io instance)
  socketConnected(socket, io);
  socket.on('disconnect', () => {
    console.log('Connection disconnected @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.', socket.id);
  });
});

那么,你的socket控制器可以是这样的:

module.exports.socketConnected = function(socket, io) {
    // new socket.io socket connected
    console.log(`controller: got socket.io connection ${socket.id}`);

    // register appropriate event handlers on the socket here
}

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多