2014-06-11 48 views
10

我正在開發一個使用Socket.io處理實時通信的Node.js應用程序。我的代碼充滿了On和Emit函數。我也使用房間功能。我的應用看起來像這樣:Socket.io最佳編碼練習

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應用程序展示了這種進展或任何能夠幫助我在更好的情況下重構我的代碼的文章?

+0

我認爲把每一個回調函數在不同的起始功能,你把io.on('連接'),也許也把它們放在一個不同的文件(使用module.exports),你會開始有一個更清晰的應用程序。 – Jujuleder

+0

@Jujuleder這正是我需要的。但我想知道如何在維護所有模塊中的套接字對象的情況下實現這一點。 – Raiss

回答

5

我認爲首先將每個回調函數放入不同的函數中,並將其放入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)*/)); 

}); 

服務器socketModule.js:

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

謝謝,雖然我沒有使用多個套接字端點,但上述方法非常有趣。 – Raiss

+0

我會更有興趣有類似 'Socket.on('event',myModule.doSomething);' 我不知道應該如何寫myModule。 – Raiss

+0

我編輯過,告訴我這是否正確 – Jujuleder