我想在客户端与套接字断开连接时更新时间。但是,下面的代码从“find({where: {room_id: roomId}})”行给我“没有方法‘indexOf’”。有人知道为什么吗?谢谢!
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;
});
});
最佳答案
基本上,事件驱动模型是当某些事件发生时您会遇到某个闭包(如果您不知道什么是闭包或它是如何工作的,请查看 this thread )。所以你的代码:
roomId = socket.on('updateStartTime', function (roomId) {
// this is where the closure starts
return roomId;
// closure ends here
}
您似乎正试图从闭包外获取 roomId。但这是行不通的。您的代码中的错误是:
尽管您希望将其分配给全局 roomId,但“return roomId”无处可去。想一想,在事件驱动模型中,你永远不知道这个函数(roomId)什么时候会被执行。因此,当您将 socket.on 结果分配给全局 roomId 时,如果尚未执行,它如何给您 roomId 呢?而且它不会阻塞在那里等待结果,因为 nodejs 的非阻塞模型。实际上,如果您查看 socket.on 的文档,它会立即返回自己,这是一个“套接字”。这就是您收到错误的原因。
你的代码的第二部分是有效的,因为它在闭包中。 roomId 指的是本地 roomId,它是一个期望值。这段代码仍然没有给你想要的,因为当有人断开连接时它不会执行。您可以尝试以下方法:
socket.on('updateStartTime', function (roomId) {
socket.on('disconnect', function() {
// your 'Room' operation here.
socket.broadcast.emit('updateChat', 'SERVER', socket.username + ' has disconnected...');
});
});
请记住,在事件驱动模型中,它不是按顺序执行的。任何事情都可能随时发生。您需要在正确的地方做正确的事。
关于mysql - Sequelize updateAttributes 在 socket.on( 'disconnet' ) 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23464951/