Socket.io最佳编码实践

时间:2014-06-11 00:59:51

标签: node.js socket.io

我正在开发一个Node.js应用程序,该应用程序使用Socket.io来处理实时通信。我的代码充满了On和Emit功能。我也使用房间功能。我的应用程序看起来像这样:

   var server = require('http').Server();
    var io = require('socket.io')(server);
    io.on('connection', function(socket){
      socket.on('event1', function(data){"lots of socket and non-socket codes" });
      socket.on('event2', function(data){"lots of socket and non-socket codes" });
      socket.on('event3', function(data){"lots of socket and non-socket codes" });
      socket.on('disconnect', function(){"Some other code"});
    });
    server.listen(portNum); 

它工作正常,但这不是我理想的解决方案。 首先,在这种方法中,一切都在一个大文件中,而不是具有独立功能的较小文件。

其次,调试和维护这个应用程序非常困难,因为当涉及1000多行代码时它非常混乱。

这是我的问题:

是否有开发企业级Socke.io应用程序的首选/最佳实践? 如果是的话,是否有任何大型的开源Socket.io应用程序可以演示这个approch或任何帮助我以更好的方式重构我的代码的文章?

3 个答案:

答案 0 :(得分:8)

我认为首先将每个回调函数放在你从io.on('connection')中放出的不同函数中,也可以将它们放在一个不同的文件中(使用module.exports),你将开始有一个更清晰的应用。

好吧所以我会给你写一个我使用的可能性,我不知道它是否是socket.io中宇宙的最佳模式,但我觉得这很好。

在你的主文件(带有io.onconnection的文件)中,你可以有这样的东西(你不必使用命名空间,这只是一个例子):

var SocketEvent = require('./socketEvent');

io.of('/user').on('connection', function (socket) {

    SocketEvent.load_common_event(socket);
    SocketEvent.load_user_event(socket);

});

io.of('/operator').on('connection', function (socket) {

    SocketEvent.load_common_event(socket);
    SocketEvent.load_operator_event(socket);

});

在你加载的socketEvent.js中你可以拥有:

exports.load_common_event = function(socket){
    socket.on('disconnect', function(){"Some other code"});
};

exports.load_user_event = function(socket){
    socket.on('event1', function(data){"lots of socket and non-socket codes" });
    socket.on('event2', function(data){"lots of socket and non-socket codes" });
    socket.on('event3', function(data){"lots of socket and non-socket codes" });
};

exports.load_operator_event = function(socket){
    socket.on('event4', function(data){"lots of socket and non-socket codes" });
    socket.on('event5', function(data){"lots of socket and non-socket codes" });
    socket.on('event6', function(data){"lots of socket and non-socket codes" });
};

如果您有任何疑问,请告诉我

添加-上

如果你想要像Socket.on('event',myModule.doSomething)这样的东西;

你可以在模块中这样做:

客户:

var myModule = require('./socketModule');

io.on('connection', function (socket) {

    socket.on('event' , myModule.doSomething(/*some parameters (socket)*/));

});

server socketModule.js:

exports.doSomething = function(/*some parameters (socket)*/){
    /* Some processing around */
};

答案 1 :(得分:0)

对于那些对传递参数感到疑惑的人来说,.bind是一个选择

const events = require('./events.js')
io.of('/chat').on('connection', (socket) => {
  socket.on('print', events.print.bind({socket, io}))
})

event.js

const util = require('util')
function print(data) {
  console.log(util.inspect(this.socket).substr(0, 100))
  console.log(util.inspect(this.io).substr(0, 100))
}
module.exports = {
  print
}

答案 2 :(得分:-1)

更多地使用页面,每个页面中的代码更少,并在需要时独立共享它们: 注意,我认为您正在使用Express。如果没有,请从我的演示中删除快递。

SELECT a.c1subject AS "SUBJECT",
       a.c3author AS "FROM",
       a.c4recipients AS "TO",
       b.date,
       c.folderURI AS "FOLDER_LOCATION",
       c.name AS "FOLDER_NAME"       
    FROM messagesText_content a
    INNER JOIN messages b ON a.docid=b.id
    INNER JOIN folderLocations c ON b.folderID=c.id
    WHERE a.c1subject LIKE ('Chunk of text%');

现在,在API或服务器上的每个页面上,您都可以像这样导入Io实例(参考且高效):

// app.js
var app = require('express')();

module.exports = app;

// server.js
var app = require('./app');
var server = require('http').createServer(app);

module.exports = server;

//socket-io-redis.js

var server      = require('../server');
var io          = require('socket.io')(server);
var redis       = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
io.set('origins', '*:*');

module.exports = io;

您还可以制作一个主连接文件,如下所示: 注意,我在这里粘贴我实际使用的确切代码,只是为了向您展示我的一些最佳做法(当然,可以根据需要进行调整和调整):

var Io = require('../path/to/io-config-file');
console.log(Io); // object
Io.to(room).emit(event, payroll);

在上面的示例中,我监听了新的连接,并经过安全验证将其订阅到各自的房间。我这样做是为了使用服务-它们是独立的,正如我所说的那样,这就是您所有代码的样子。