使用connect.io服务器持久保存数据

我在MongoDB中使用socket.io,并承诺。 我想在会话build立时将一些数据保存在Mongo中,并且在保存这些数据之前不一定能处理更多的套接字事件。

// Simplified code io.sockets.on('connection', function(socket) var req = socket.handshake; mongoDbPromise.then(function (db) { return db.collection('mycollection').insert({some_user_data: req.query.some_user_data}); }).then(function (insertResult) { // do some other work }).catch(function (error) { socket.disconnect(); logger.info(error); }); } 

我遇到的问题是connection套接字事件在连接处理程序返回后立即发出,但是当MongoDB的承诺parsing和我的处理程序被调用时,build立连接的工作继续。 在收到connection后立即发出请求的客户端会以不一致的状态查看应用。

我可以看到两种方法来解决这个问题:

1)使用某种callback来控制何时发射connection 。 不过,我还没有看到socket.io文档中有任何签名,可以这样做。

2)而不是使用connection来表示套接字已准备就绪,请使用其他一些自定义事件(让它称为connection_established )并将其发送到then处理程序中。

选项1可能吗? 有没有更好的方法来处理这种情况?

那么,如果你在你的连接处理程序中有asynchronous的工作,那么在你完成连接处理程序的工作之前,你不能阻止客户端连接它。 你有几个select来解决这个问题:

  1. 您可以使用中间件挂接到socket.io连接的身份validation过程,并使用该function来控制事件。 如果您的数据库操作失败,您将基本上像连接没有授权,将断开连接。

  2. 您可以向客户端发送自己的“connectionReady”消息给客户端,并将客户端编程为不发送任何东西,直到它收到“连接准备”消息,只有当连接完成时才会发送消息(听起来像是你已经有了这个想法connection_established)。

socket.io v1和更高版本中的auth进程可以使用如下的中间件完成:

 io.use(function(socket, next) { var req = socket.handshake; mongoDbPromise.then(function (db) { return db.collection('mycollection').insert({some_user_data: req.query.some_user_data}); }).then(function (insertResult) { // do some other work // socket is now ready to go next(); }).catch(function (error) { // error on authentication next(new Error('not authorized'); logger.info(error); }); }); 

connectionReady进程可以像这样工作:

 // Simplified code io.sockets.on('connection', function(socket) var req = socket.handshake; mongoDbPromise.then(function (db) { return db.collection('mycollection').insert({some_user_data: req.query.some_user_data}); }).then(function (insertResult) { // do some other work // send client a message indicating that the connection is now ready socket.emit("connectionReady", true); }).catch(function (error) { socket.disconnect(); logger.info(error); }); }