Mysql Sequelize updateAttributes在(';disconnet';)上的套接字中不起作用
我想更新客户端与套接字断开连接时的时间。但是,下面的代码从find({where:{room\u id:roomId}}})行中给出了“has no method'indexOf'”。有人知道为什么吗?谢谢Mysql Sequelize updateAttributes在(';disconnet';)上的套接字中不起作用,mysql,node.js,express,socket.io,sequelize.js,Mysql,Node.js,Express,Socket.io,Sequelize.js,我想更新客户端与套接字断开连接时的时间。但是,下面的代码从find({where:{room\u id:roomId}}})行中给出了“has no method'indexOf'”。有人知道为什么吗?谢谢 var roomId; roomId = socket.on('updateStartTime', function(roomId) { //some code return roomId }); socket.on('disconnect', function() {
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
}
看来你是想把室友从外面弄来。但这行不通。代码中的错误是:“return roomId”不会出现,尽管您希望将其分配给全局roomId。想想看,在一个事件驱动的模型中,你永远不知道这个函数(roomId)什么时候会被执行。因此,当您将socket.on结果分配给全局roomId时,如果它还没有执行,它怎么能给您roomId呢?它不会在那里阻塞等待结果,因为nodejs的非阻塞模型。实际上,如果您查看socket.on的文档,它会立即返回自身,即“socket”。这就是为什么你会犯错误 代码的第二次和平之所以有效,是因为它在闭包内。roomId指的是本地roomId,它是一个期望值。尽管如此,这段代码仍然不能满足您的需求,因为当有人断开连接时,它不会执行。以下是您可以尝试的:
socket.on('updateStartTime', function (roomId) {
socket.on('disconnect', function() {
// your 'Room' operation here.
socket.broadcast.emit('updateChat', 'SERVER', socket.username + ' has disconnected...');
});
});
请记住,在事件驱动模型中,它不是按顺序执行的。任何事情都可能随时发生。你需要在正确的地方做正确的事情。伙计,你误解了事件驱动模型的工作原理。当所有的客户都与一个房间断开连接时,你是在试图录制吗?@yaoxing嗨,现在聊天只有一个。所以我想记录唯一的客户端何时与房间断开连接。我是如何误解事件驱动模型的?谢谢你的回复。这可能也解释了为什么我得到了TypeError:当我试图在socket.on(disconnect)中使用JSON.stringify打印roomId时,将循环结构转换为JSON。我想我需要找到一种更好的方法来获取roomId。我需要为此打开一个新线程。顺便说一句,聊天室是一个数据库模型,它将聊天信息存储在我的数据库中。roomId是一个主键自动递增。另外,我有一个socket。当聊天开始时,客户端的emit('updateStartTime',roomId')将启动。那么,这是否意味着我们可以知道roomId何时通过socket.on()传递到服务器端?您可以将socket.on(“断开”)放入socket.on('updateStartTime'),正如我在修改后的回答中所示。谢谢。您的方法有效!谢谢你的帮助!我想我现在更了解事件驱动和关闭:)