Sequelize updateAttributes在socket.on('disconnet')中不起作用

我想更新客户端从套接字断开的时间。 然而,下面的代码给我“没有方法”indexOf'“行”查找({其中:{room_id:roomId}})“。 有人知道为什么吗? 谢谢!

var roomId; roomId = socket.on('updateStartTime', function(roomId) { //some code return roomId }); socket.on('disconnect', function() { var date = new Date(); Room.find({ where: { room_id: roomId } }).complete(function(err, room) { if (err) console.log(err); room.updateAttributes({ end_time: date }).success(function(room) { console.log("end_time: " + room.end_time); }); }); socket.broadcast.emit('updateChat', 'SERVER', socket.username + ' has disconnected...'); }); 

同时,从客户端的socket.emit中触发一个事件。

  roomId = socket.on('updateStartTime', function(roomId) { var date = new Date(); Room.find({ where: { room_id: roomId } }).complete(function(err, room) { if (err) console.log(err); room.updateAttributes({ start_time: date }).success(function(st) {}) return roomId; }); }); 

基本上事件驱动的模型是,当发生某种事件时,你遇到了某个闭包(如果你不知道什么是闭包或它是如何工作的,请看这个线程 )。 所以你的代码:

 roomId = socket.on('updateStartTime', function (roomId) { // this is where the closure starts return roomId; // closure ends here } 

看起来你正试图从封闭的外面得到空间。 但是这不会工作。 你的代码中的错误是:
尽pipe您希望将其分配给全局roomId,但是“return roomId”却不起作用。 想一想,在一个事件驱动模型中,你永远不知道这个函数(roomId)何时执行。 因此,当您将socket.on结果分配给全局roomId时,如果尚未执行,那么它如何给予roomId? 而且不会因为nodejs的非阻塞模型而阻塞等待结果。 实际上,如果你查看socket.on的文件,它会立即返回,这是一个'套接字'。 这就是为什么你得到你的错误。

你的代码的第二个和平工作,因为它在closures。 roomId是指预期值的本地roomId。 这段代码仍然不会给你想要的,因为当某人断开连接时,它不会被执行。 这里有一些你可以尝试的:

 socket.on('updateStartTime', function (roomId) { socket.on('disconnect', function() { // your 'Room' operation here. socket.broadcast.emit('updateChat', 'SERVER', socket.username + ' has disconnected...'); }); }); 

请记住,在事件驱动的模型中,它不是按顺序执行的。 任何事情都可以在任何时候发生。 你需要在正确的地方做正确的事情。