我有以下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事件?
答案 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 );
}
});