Mysql Sequelize updateAttributes在(';disconnet';)上的套接字中不起作用

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() {

我想更新客户端与套接字断开连接时的时间。但是,下面的代码从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 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'),正如我在修改后的回答中所示。谢谢。您的方法有效!谢谢你的帮助!我想我现在更了解事件驱动和关闭:)