【问题标题】:Timing issue with mysql query in NodeJSNodeJS中mysql查询的计时问题
【发布时间】:2012-05-01 22:54:43
【问题描述】:

我在 nodejs 中使用 mysql 模块。

我想做这样的事情,但问题是查询的回调是异步的,我无法正确填充结果数组。我该怎么办?谢谢!

function fn(callback) {
    client.query(
        'SELECT * FROM imbarcazioni',
        function select(err, ships) {
        if(err) {
            throw err;
        }

        ships.forEach(function(ship) {
            client.query(
                'SELECT * FROM storico_imbarcazioni WHERE id_imbarcazione=' + ship.id,
                function select(err, hist) {
                    ship.history = hist;
                }
            );
        });

        callback(hist);
    });
}

【问题讨论】:

    标签: mysql node.js asynchronous timing


    【解决方案1】:

    像往常一样,我推荐async 处理这些事情。在这里,你可以使用async.map

    function selectHistory(ship, callback) {
        client.query('SELECT * FROM storico_imbarcazioni WHERE id_imbarcazione = ?', [ship.id], function(err, history) {
            if(err) return callback(err);
            ship.history = history;
            callback(null, ship);
        });
    }
    
    client.query('SELECT * FROM imbarcazoni', function(err, ships) {
        async.map(ships, selectHistory, function(err, ships) {
            // ships is an array with each ship along with it's history
        });
    });
    

    也就是说,对于您的特定示例,我宁愿使用 JOIN 并在 SQL 中处理它:

    SELECT * FROM imbarcazioni
    LEFT JOIN storico_imbarcazoni ON storico_imbarcazoni.id_imbarcazione = imbarcazioni.id
    

    【讨论】:

    • 谢谢,这就是我要找的!对于左连接我试过但没有成功..
    • @frx08:感谢您的修复!我修复了 SQL 语句(对于 JOIN)——有一些错误。您应该 read up on JOINs 和 StackOverflow 联合创始人 Jeff Atwood 的 here is a nice visualization
    • sql 方式的问题是我想要一个包含自己的历史对象的船舶对象,而使用 sql 查询我得到许多重复的对象..
    • 是的,您必须对结果进行归一化以适合您请求的模型,但是性能提升是巨大的,而且,JOIN 基本上就是关系数据库的全部内容。
    • 感谢您的回复,Linus。这帮助我解决了一些我被挂断的问题。现在我的代码很干净。它有效。 :)
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多