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

标签 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;
    });
});

最佳答案

基本上,事件驱动模型是当某些事件发生时您会遇到某个闭包(如果您不知道什么是闭包或它是如何工作的,请查看 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/

相关文章:

node.js - socket.io 创建动态房间

javascript - 从变量创建对象 ES6

node.js - 语法错误: Unexpected token ; while compiling ejs

MySQL:如果列等于这个或那个,则对行进行分组

MySQL 索引检查顺序

node.js - 合并node.js模块导出中的多个回调

node.js - isAuthenticated() 到底是如何工作的?

mysql - 通过express从MySql获取数据

php - 如何使用 php 将图像序列更改存储到 mysql 数据库

php - 获取数百个地址的 lat lng