【发布时间】:2017-01-14 07:55:28
【问题描述】:
我将 socket.io 与 MongoDB 和 Promise 一起使用。我想在建立会话时在 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 的承诺解决并且我的 then 处理程序被调用时,设置连接的工作仍在继续。在收到connection 后立即发出请求的客户端会看到应用处于不一致状态。
我可以看到两种方法来解决这个问题:
1) 使用某种回调来控制何时发出connection。不过,我在 socket.io 文档中没有看到任何迹象表明可以这样做。
2) 不要使用connection 来表示套接字已准备就绪,而是使用其他一些自定义事件(我们称之为connection_established)并在then 处理程序中发出它。
选项 1 可能吗?有没有更好的方法来处理这种情况?
【问题讨论】:
-
几周前,我实现了this article 中描述的方法,对我来说效果很好。基本上,您允许客户端成功连接,但在完成身份验证/数据查找后,有第二个商定的握手消息。基本上是您的选择 2)。
标签: javascript node.js mongodb socket.io