2013-07-27 2 views
3

Это моя конфигурация приложенияКак испустить событие в socket.io из файла маршрутов?

app.js

//SERVER 
var server = app.listen(3000, function(){ 
    console.log("Express server listening on port %d in %s mode", app.get('port'), 
    app.settings.env); 
}); 
//SOCKET.IO 
var io = require('./socket.io').listen(server) 

/socketio

var socketio = require('socket.io') 

module.exports.listen = function(app) 
{ 
    io = socketio.listen(app); 
    io.configure('development',function() 
    { 
      //io.set('transports', ['websocket', 'xhr-polling']); 
      //io.enable('log'); 
    }); 
    io.configure('production',function() 
    { 
     io.enable('browser client minification'); // send minified client 
     io.enable('browser client etag');   // apply etag caching logic based on version number 
     io.set('log level', 1);     // reduce logging 
     io.set('transports', [      // enable all transports (optional if you want flashsocket) 
      'websocket' 
      , 'flashsocket' 
      , 'htmlfile' 
      , 'xhr-polling' 
      , 'jsonp-polling' 
     ]); 
    }); 
    io.sockets.on('connection', function (socket) 
    { 
     console.log("new connection: "+socket.id); 
     socket.on('disconnect',function(){console.log("device "+socket.id+" disconnected");}); 

     socket.emit('news', { hello: 'world' }); 
     socket.on('reloadAccounts',function(data) 
     { 
      var accounts=['account1','account2'] 
      socket.emit('news',accounts) 
     }); 
    }); 
    return io 
} 

/маршруты

exports.newAccount=function(fields,callback)//localhost:3000/newAccountForm 
    { 
//... bla bla bla config db connection bla bla bla 
      db.collection('accounts').insert(fields,function(err,result) 
      { 
       if(err) 
       { 
        console.warn(err); 
        db.close(); 
        return callback(err,null); 
       }else{ 
        if(result) 
        { 
         db.close(); 
         return callback(null,result); 
           socket.emit('new account created',result) // i want to emit a new event when any user create an account 

        }else{ 
         db.close(); 
         return callback('no se consigue resultado',null); 
        } 
       } 
      }) 
     }); 
    } 

Как испускают событие в Socket.io от файл маршрутов?

+0

Возможный дубликат [Использовать socket.io внутри файла экспресс-маршрутов] (http://stackoverflow.com/questions/18856190/use-socket-io-inside-a-express-routes-file) – GiveMeAllYourCats

ответ

1

Сначала вам нужно решить, какой сокет вы хотите отправить новую информацию. Если это все из них (для всех, кто связан с вашим приложением), это было бы легко, просто использовать io.sockets.emit:

В файле ./socket.io добавить exports.sockets = io.sockets; где-то после io = socketio.listen(app);. Затем в файле маршрутов, вы можете излучать так:

var socketio = require('./socket.io'); 
socketio.sockets.emit('new account created', result); 

Если вы знаете сокет идентификатор, который вы хотите отправить, то вы можете сделать это:

var socketio = require('./socket.io'); 
socketio.sockets.sockets[socketId].emit('new account created', result); 

Вы также можете выбрать гнездо экспресс идентификатора сессии:

Прежде всего, необходимо прикрепить идентификатор сеанса к разъему авторизации:

io.set('authorization', function (data, accept) { 
    // check if there's a cookie header 
    if (data.headers.cookie) { 
     // if there is, parse the cookie 
     data.cookie = cookie.parse(data.headers.cookie); 
     // note that you will need to use the same key to grad the 
     // session id, as you specified in the Express setup. 
     data.sessionID = data.cookie['express.sid']; 
    } else { 
     // if there isn't, turn down the connection with a message 
     // and leave the function. 
     return accept('No cookie transmitted.', false); 
    } 
    // accept the incoming connection 
    accept(null, true); 
}); 

Затем вы можете выбрать сокеты с идентификатором сессии:

var socketio = require('./socket.io'); 
var sockets = socketio.sockets.forEach(function (socket) { 
    if (socket.handshake.sessionID === req.sesssionID) 
     socket.emit('new account created', result); 
}); 

Вы также можете запросить свой сессионный магазин и с помощью метода, который я описал выше, испускает событие к розеткам с SESSIONID, соответствующей ваш запрос.

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