2013-12-09 24 views
9

對於我的REST api,我爲每個路徑創建了一個文件。如何在node.js和socket.io應用程序中組織套接字處理

app.get('/api/user', routes.user.index); 
app.get('/api/user/login', routes.user.login); 

等,等

現在我介紹socket.io到後端,看來我只能調用一個函數的所有套接字事件。

var socket = require('./socket/stuff.js'); 

io.sockets.on('connection', function(sock){ 
    socket.stuff(sock, io); 
}); 

我應該如何分手的./socket/stuff.js文件(其中出口stuff)。進入單獨的文件。我想最終用套接字替換我的REST API,但我不希望所有文件都放在一個文件中。

我想我會:

./socket/chat.js 
./socket/user.js 

等等,等等

回答

13

要整理的事件處理程序在不同的文件,你可以使用這樣的結構:

./main。 JS

var io = require('socket.io'); 
var Chat = require('./EventHandlers/Chat'); 
var User = require('./EventHandlers/User'); 

var app = { 
    allSockets: [] 
}; 

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

    // Create event handlers for this socket 
    var eventHandlers = { 
     chat: new Chat(app, socket), 
     user: new User(app, socket) 
    }; 

    // Bind events to handlers 
    for (var category in eventHandlers) { 
     var handler = eventHandlers[category].handler; 
     for (var event in handler) { 
      socket.on(event, handler[event]); 
     } 
    } 

    // Keep track of the socket 
    app.allSockets.push(socket); 
}); 

./EventHandlers/Chat.js

var Chat = function (app, socket) { 
    this.app = app; 
    this.socket = socket; 

    // Expose handler methods for events 
    this.handler = { 
     message: message.bind(this) // use the bind function to access this.app 
     ping: ping.bind(this) // and this.socket in events 
    }; 
} 

// Events 

function message(text) { 
    // Broadcast message to all sockets 
    this.app.allSockets.emit('message', text); 
}); 

function ping() { 
    // Reply to sender 
    this.socket.emit('message', 'PONG!'); 
}); 

module.exports = Chat; 
+0

對於示例套接字事件處理程序,chat.js看起來像什麼? – chovy

+0

@chovy請看我更新的回答 –

+0

我最終做了類似的事情。但是我只是調用'require('./ sockets')。register(sock,io)',並且這個函數調用'。chat.js'和'。/ user.js'輸出的'register'函數 – chovy

相關問題