Nodejs-mysql池连接不能与异步系列一起使用

时间:2017-09-06 04:23:46

标签: mysql node.js async.js

以下是我的节点脚本的代码片段:

pool.getConnection(function(err, maria_connection) {

        maria_connection.query(' CREATE TABLE Currency(uuid VARCHAR(10),name VARCHAR(12),PRIMARY KEY(uuid), UNIQUE(name))')
        async.series({
                one: function(callback){
                    var currency_ids = []

                        request('host_url', function (error, response, html) {
                          if (!error && response.statusCode == 200) {
                            .....used maria_connection here to save some data
                          }
                        })
                    setTimeout( function(){
                      callback(null, 1);
                    },20000)
                 },
                 two: function(callback){
                     maria_connection.query({
                      sql: 'SELECT uuid FROM Currency'
                      },
                      function (error, results, fields){
                        console.log(error)
                        add_currencies( results )
                      }
                    )
                       setTimeout( function(){
                        callback(null, 2);
                       },20000)
                 },
                 three: function(callback){
                       console.log('third series called')
                       maria_connection.query({
                          sql: 'SELECT * FROM Brokers'
                          },
                          function (error, results, fields){
                             if (error) throw error;
                            console.log(results)
                          }
                       )
                      setTimeout( function(){
                        callback(null, 3);
                       },20000)
                 },
                 four: function(callback){ process.exit(-1); }
        }, function(error, results) { // <--- this is the main callback
                maria_connection.release();
        });

现在系列中的前两个项目工作正常,但是当调用第三个函数时,控制台日志会打印文本“第三个系列名为”,但maria_connection不起作用。它甚至没有任何错误。

1 个答案:

答案 0 :(得分:0)

我认为您在使用async.jsthrow()时没有正确使用setTimeout()。你不应该同时使用它们。

例如,您对setTimeout()的使用假定当前任务最多需要20秒 - 但如果没有,那该怎么办?如果您致电callback(),您将在当前任务完成之前开始下一个任务。您可能同时运行两个查询(这违背了使用async.series())的想法。

最好在确保任务完成(或返回错误)时触发callback()。如果发生错误,而不是抛出错误,请将其传递到callback,以便它可以优雅地停止async.series()

async.series({
    one: function(callback){
        var currency_ids = []
        request('host_url', function (error, response, html) {
            if (error)
                return callback(error);
            if (response.statusCode != 200) 
                return callback(new Error('not 200'));
            // .....used maria_connection here to save some data (*)
        });
    },
    two: function(callback){
        maria_connection.query({ sql: 'SELECT uuid FROM Currency' }, function (error, results, fields){
            if (error)
                return callback(error);
            add_currencies(results); // (*)
        });
    },
    three: function(callback){
        console.log('third series called')
        maria_connection.query({ sql: 'SELECT * FROM Brokers' }, function (error, results, fields){
            if (error)
                return callback(error);
            console.log(results)
            callback();
        });
    }
}, function(error, results) {
    // if an error occurs, it will come down here
    // if all tasks are completed successfully, it will also come down here too
    console.log(error, results); 
    maria_connection.release(); 
    process.exit(-1);
});

如果(*)是异步操作,请确保在操作完成时调用回调。例如,如果add_currencies()是异步操作,则您很可能希望将其写为

function add_currencies(results, callback) {
    doAsyncOperation(results, function (error) {
        if (error)
            return callback(error);
        callback();
    });

    // or simply doAsyncOperation(results, callback);
}

重点是始终在每项任务中触发callback至少一次。如果没有,通常情况就要开始了。