【问题标题】:How to handle Knex update Query within Socket IO event loop如何在 Socket IO 事件循环中处理 Knex 更新查询
【发布时间】:2019-05-15 10:31:56
【问题描述】:

我的节点服务器中有一个套接字侦听器,它在几毫秒的时间内接收到套接字事件,我正在使用 MySql 客户端使用 knex.js 更新我在事件数据中收到的状态。但有时由于更快的事件循环,它不会更新。

我尝试过 async-await 但它没有帮助我。这是我的代码。请帮我解决这个问题。

socket.on("orderUpdate", function(message) {
    setImmediate(function(){
        orderModel.updateOrderStatus(message);
    })
 });

这里我的updateOrderStatus方法如下。

updateOrderStatus: async function (data) {
    try {
        return await knex(table_name)
            .where('order_id', data.order_id)
            .update({
                status: data.status,
            })
    } catch (e) {
        return e;
    }
}

【问题讨论】:

    标签: mysql node.js socket.io async-await knex.js


    【解决方案1】:

    1.确保您正在获取套接字事件。请使用socket acknowledgment 确定。

    2.打印查询日志,检查更新是否成功。

    socket.on("orderUpdate", async function (message, callback) {
        let resp = await orderModel.updateOrderStatus(message);
        return callback(resp);
    });
    
    socket.emit("orderUpdate", message, (resp) => {
        console.log("resp : ", resp);
    });
    

    【讨论】:

    • 我不需要确认用户,因为它是仅推送的事件结构,所以我不需要向用户发送。除此之外,我在套接字中获取的任何数据都必须在数据库中更新,并且我还在 orderUpdate 事件中打印了所有日志。我认为 WebSocket 事件没有问题。
    • 检查您的更新查询日志(在此处发布您的日志)以验证受影响的行,因为如果套接字事件没有问题并且您已经按照上面的答案(async-await)中提到的那样实现了套接字侦听器那么代码应该可以工作,假设您从客户端获得的消息已经过验证,因为您在传递给 updateOrderStatus 函数之前没有验证消息。
    • 我一定会说的。另一件事是,如果事件变得更慢,那么所有状态都会完美更新。它只发生在更快的事件中,即 5 毫秒内发生三个或更多事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多