如何在socket.io上绑定ready事件?

时间:2015-11-24 09:25:24

标签: node.js express socket.io socket.io-1.0

我有以下express / socket.io应用程序:

var express = require('express');
var sio = require('socket.io');

var app = express();
var server = require('http').createServer(app).listen(3000, function () {
   console.log('Server listening on 3000 port');
});

var io = sio.listen(server);

从上面的代码中我们可以看到,我们收听3000端口和pring Server listening on 3000 port消息到控制台。现在我需要为socket.io listen方法打印相同的消息,但是这个方法没有得到回调。所以我需要以下内容:

var io = sio.listen(server);
io.on('ready', function () {
     console.log('Socket io server listening...');
});

我怎么能绑定socket.io的listen事件?

2 个答案:

答案 0 :(得分:2)

这是一个简洁的方法:

var express = require('express');
var app     = express();
var server  = app.listen(3000);
var io      = require('socket.io')(server);

server.on('listening', function() {
  console.log('Server listening on 3000 port');
});

这样,socket.io将搭载在Express之上,当listening事件触发时,socket.io也准备就绪。

如果需要,可以将listening事件处理程序作为回调传递给app.listen()来替换它。

答案 1 :(得分:0)

你这样做有点不对劲。如果你像这样初始化app和socket.io

httpServer = http.createServer( app ).listen( process.env.PORT, process.env.IP || "0.0.0.0", function() { 
    console.log( "Express app initialized" );
    var io = require( 'socket.io' )( httpServer );
});

它将调用socket.io的attach方法,该方法确实没有回调。

您可以做的是稍后检查io变量,它不应该为空。或者甚至更好地将它包装在try/catch这样的

var io, httpServer;
httpServer = http.createServer( app ).listen( process.env.PORT, process.env.IP || "0.0.0.0", function() { 
    console.log( "Express app initialized" );
    try {
        io = require( 'socket.io' )( httpServer );
        if( io != null ) {
            console.log( "Socket server ready!" )
            // do what is needed later
        }
        else {
            throw new Error( "Returned null after attaching to express server." );
        }
    }
    catch( error ) {
        console.log( "Failed to init socket.io!", error );
    }

});