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

时间:2014-05-05 04:46:34

标签: mysql node.js express socket.io sequelize.js

我想更新客户端与套接字断开连接的时间。但是,下面的代码从“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;
    });
});

1 个答案:

答案 0 :(得分:1)

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

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

好像你正试图从关闭的外面获得roomId。但这不会奏效。代码中的错误是:
虽然你期望将它分配给全球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...');
    });
});

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