2015-11-09 3 views
0

Я ищу, чтобы отделить мои события Socket.io/init от моей логики сервера основного узла. Цель состоит в том, чтобы не только поддерживать код Socket.io, но и поддерживать любые события, которые я могу испустить.Инкапсулировать события Socket.io в узле?

Я немного завалены понимания масштабов этого и метод инкапсуляции с узлом и в надежде получить некоторые разъяснения на лучший способ делать вещи.

server.js

//-- Socket.io 
var http = require('http').Server(app); 

//-- Encapsulate Socket init/events 
var io = require('./socket.js').listen(http) 

var api = express.Router(); 

api.route('/users/:user_id') 
    .put(function(req, res) { 
     io.dispatch(req.body.event); 
    } 
} 

//-- Start Server 
http.listen(port); 
console.log('Server started on port: ' + port); 

io.init(app); 

socket.js

'use strict' 

var io = require('socket.io'); 
var ioJwt = require('socketio-jwt'); 

var clientsConnected = 0; 
var ioServer; 

exports.listen = function(http, app) { 
    ioServer = io.listen(http); 
    return ioServer; 
} 

exports.init = function(app) { 

    ioServer.use(ioJwt.authorize({ 
     secret: app.get('secret'), 
     handshake: true 
    })); 

     ioServer.on('connection', function(socket){ 
     connect(); 

     socket.on('error', function(err) { 
      console.log('Socket.IO error:'); 
      console.log(err); 
     }); 

     socket.on('disconnect', function(){ 
      disconnect(); 
     }); 
    }); 
} 

function connect() { 
    clientsConnected++; 

    console.log('user connected. ' + clientsConnected + ' total.'); 
} 

function disconnect() { 
    clientsConnected--; 

    console.log('user disconnected. ' + clientsConnected + ' total.'); 
} 
+0

Что вы имеете в виду под "герметизировать" здесь? Какие конкретные цели вы пытаетесь достичь? – jfriend00

+0

Переместите код, связанный с Socket.io, в отдельный файл. –

ответ

0

Минимально связи два модуля необходимо иметь в том, что сервер HTTP должен быть предоставлен модуль розетками поэтому он может правильно инициализировать себя, и http-сервер должен вызвать модуль сокетов для отправки соответствующим образом. Таким образом, вы можете продолжать модульность, которая имеет только эти два соединения:

server.js

var http = require('http').Server(app); 
var dispatch = require('./sockets.js')(http); 

var api = express.Router(); 

api.route('/users/:user_id') 
    .put(function(req, res) { 
     dispatch(req.body.event); 
    } 
} 

//-- Start Server 
http.listen(port); 
console.log('Server started on port: ' + port); 

sockets.js

'use strict' 

var io = require('socket.io'); 
var ioJwt = require('socketio-jwt'); 

var clientsConnected = 0; 
var ioServer; 

module.exports = function(server) { 
    ioServer = io.listen(server); 
    ioServer.use(ioJwt.authorize({ 
     secret: app.get('secret'), 
     handshake: true 
    })); 

    ioServer.on('connection', function(socket){ 
    connect(); 

    socket.on('error', function(err) { 
     console.log('Socket.IO error:'); 
     console.log(err); 
    }); 

    socket.on('disconnect', function(){ 
     disconnect(); 
    }); 

    // return dispatch function 
    return function(data) { 
     io.dispatch(data); 
    } 
} 

function connect() { 
    clientsConnected++; 

    console.log('user connected. ' + clientsConnected + ' total.'); 
} 

function disconnect() { 
    clientsConnected--; 

    console.log('user disconnected. ' + clientsConnected + ' total.'); 
} 
+0

@DonBoots - это работало для вас? – jfriend00

Смежные вопросы