如何在node.js和socket.io应用程序中组织套接字处理
对于我的REST API,我已经为每个路线创build了一个文件。
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
等等
要在不同的文件中组织事件处理程序,可以使用如下所示的结构:
./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;