Node.js Nodejs,保持MongoStore中的套接字io连接处于活动状态

Node.js Nodejs,保持MongoStore中的套接字io连接处于活动状态,node.js,session,socket.io,Node.js,Session,Socket.io,在nodejs express应用程序中,我在server.js文件中设置了套接字io连接。 做这样的事情效果很好 var server = require('http').createServer(app) var io = require('socket.io').listen(server); io.sockets.on('connection', function (socket) { // how can I save globally this 'socket'? });

在nodejs express应用程序中,我在server.js文件中设置了套接字io连接。 做这样的事情效果很好

var server = require('http').createServer(app)
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {

    // how can I save globally this 'socket'?

});
我想将这个“套接字”全局保存在server.js文件中,以便在项目中的任何地方都能使用它。像这样:

app.get('/on', function(req, res){
    socket.on('test', function (data) {
        console.log(data);
    });
});
app.get('/emit', function(req, res){
    socket.emit('test', "ciao");
});
我知道有一种方法可以在会话中保存“套接字”连接。我的会话设置:

app.configure(function(){
    // ....
    app.use(express.cookieParser(SITE_SECRET));
    app.use(express.session({
        secret : 
        ,store  : new MongoStore({
        mongoose_connection : mongoose.connection
        ,db: mongoose.connections[0].db
    })
    ,cookie: { maxAge: new Date(Date.now() + (1000*60*60*24*30*12)) }
    }));
     ...
});
做这件事的好方法是什么


另外,在完成此保存之后,如果连接尚未打开,如何使用socket.on()和socket.emit()加载第一页?

您可能听到的不是将套接字保存到会话中,而是通过会话cookie引用套接字,会话cookie在套接字授权过程中传递给服务器。在授权期间,这是传递给服务器的对象类型的示例:

{
  headers: req.headers,       // <Object> the headers of the request
  time: (new Date) +'',       // <String> date time of the connection
  address: socket.address(),  // <Object> remoteAddress and remotePort object
  xdomain: !!headers.origin,  // <Boolean> was it a cross domain request?
  secure: socket.secure,      // <Boolean> https connection
  issued: +date,              // <Number> EPOCH of when the handshake was created
  url: request.url,           // <String> the entrance path of the request
  query: data.query           // <Object> the result of url.parse().query or a empty object
}
保存会话ID后,我们可以使用典型的连接事件:

var server = require('http').createServer(app)
var io = require('socket.io').listen(server);

var clients = {};
io.sockets.on('connection', function (socket) {
  // save to a global object
  var session = socket.handshake.sessionID;
  clients[session] = socket;

  socket.on('disconnect', function() {
    delete clients[session];
  });
});
然后我们有一个通过cookie签名的全局引用。然后,我们可以像这样访问套接字:

app.get('/path', function(req, res) {
  var socket = clients[req.sessionID];
  socket.emit('Socket client accessed route.');
});
请记住,对于具有多个选项卡的客户端,您可能必须在全局逻辑中添加一些逻辑,这将导致两个套接字具有相同的授权cookie


至于您关于使用
socket.on()
socket.emit()
的问题,在建立连接之前,您不能使用它,因为套接字本身不存在。如果要向所有连接的客户端发送消息,则只需使用全局
io.sockets
对象。这将更像是
io.sockets.emit()

谢谢你的回答。。。但我仍然有一些问题。代码不在io.set('authorization')内,也不在io.sockets.on('connection')内,但在终端中我没有看到错误,只有info-socket.io启动。发生了什么?因此,如果我尝试在路由中调用它,套接字没有定义……你说的“代码不在内部”是什么意思?我还做了一次编辑,因为我错误地使用了cookie解析器。ehh,我为错误的表达式感到抱歉。我的意思是,如果我在io.set('authorization',function(handshake,callback){内放一个console.log(“test”),然后重新启动服务器,就没有“test”如果我继续/path,错误是无法调用undefined的方法'emit',因为clients中没有保存任何内容。我尝试了另一次尝试,但没有结果。我阅读并遵循。但仍然有相同的响应…:(
app.get('/path', function(req, res) {
  var socket = clients[req.sessionID];
  socket.emit('Socket client accessed route.');
});