Node.js – Socket.io – Express 3

我是Node.js和Express的一个小菜鸟:(我有一个访问其他模块中的socket.io对象的问题。我创build了一个全局variables来保存一个套接字对象,但是一旦用户closures连接技术上我猜连接仍然存在,但是我由于资源的原因删除了它。

每次build立连接时都会注意到,我们将该套接字分配给所有其他模块可访问的全局variables。

// App.js var io = require('socket.io').listen(server); var sessionsConnections = {}; io.sockets.on('connection', function (socket) { global.socket = socket; sessionsConnections[socket.id] = socket; ..... } socket.on("disconnect", function() { delete sessionsConnections[socket.id]; }); // Match.js global.socket.emit('lobby:createMatch', data); 

如果最后分配给全局的连接closuresMatch.js将被拧紧。 在这一点上,Match.js是唯一需要socket.io引用的模块。 Match.js有一堆用于处理事件的输出,发出更改并呈现视图。

有什么build议如何处理? 是否有可能实例化一个初始的套接字连接,以生活在App.js为全球参考的目的?

io.sockets.on('connection', function(socket) {...})socketvariables对于每个连接都是不同的。

由于在你的代码中global.socket总是一个相对于最后连接的客户端的套接字的引用,所以如果这个客户端断开连接,这个套接字就会死掉。

无论如何,我没有看到有任何理由使用全局variables。 如果您需要向特定的客户端发送消息,则可以在连接callback中使用socketvariables:

 io.sockets.on('connection', function (socket) { socket.emit('foo', 'bar'); } 

如果您需要访问另一个模块中的套接字,则可以导出sessionsConnections对象,并通过其id来访问您需要的套接字:

 //In app.js exports.connections = sessionsConnections; //In match.js var app = require('./app.js'); app.connections[clientId].emit('foo', 'bar'); 

当然,你需要跟踪ID的某个地方。

你可以试试express.io ,

http://express-io.org/

 npm install express.io 

除了它具有内置的socket.io集成之外,它和express一样工作。 它也有基本的路由,所以处理你的问题要容易一些。

看看这个简单的例子:

 app = require('express.io')() app.http().io() app.io.route('some-event', function(req) { req.io.broadcast('announce', 'someone triggered some-event') }) app.listen(7076) 

您还可以使用对象进行路由,这使得它更像传统的控制器:

 app = require('express.io')() app.http().io() app.io.route('posts', { create: function(req) { // create a post }, remove: function(req) { // remove a post } }) app.listen(7076) 

希望有所帮助!