首页 > 解决方案 > 无法在 javascript 循环中从数据库中获取数据

问题描述

我在nodejs中使用MySQL模块来读取每一行中的特定列以查看它是否为空,将同一行上的另一列发送到Web服务以处理该值以填充空值。

这是我的代码:

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '123456789',
    database : 'bank114'
});

var total_rows;

connection.connect();

connection.query('SELECT count(*) from bank114_x;', function (error, results, fileds) {
    total_rows = results[0]['count(*)'];
    console.log(total_rows);
    iterator();
});

function iterator(){
    for (var i = 1; i <= total_rows; i++) {
        fetch_data(i)

    }
}

function fetch_data(id){
    connection.query({
            sql: 'SELECT * FROM `bank114_x` WHERE `id` = ?',
            timeout: 40000, // 40s
        },
        [id],
        function (error, results, fields) {
            console.error(error);
            if (results[0].f6781 == null){
                //send f6780 column to a webservice to calculate f6781
            }
        }
    );
}
connection.end();

问题是,我可以在表的单行上执行此操作(results[0]返回行),但是当我使用 for 循环遍历表中的所有行时,出现错误:

{ Error: Cannot enqueue Query after invoking quit.
    at Protocol._validateEnqueue (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:204:16)
    at Protocol._enqueue (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:139:13)
    at Connection.query (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/Connection.js:208:25)
    at fetch_data (/mnt/sdb2/WebstormProjects/translator/main.js:29:16)
    at iterator (/mnt/sdb2/WebstormProjects/translator/main.js:23:9)
    at Query._callback (/mnt/sdb2/WebstormProjects/translator/main.js:18:5)
    at Query.Sequence.end (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)
    at Query._handleFinalResultPacket (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Query.js:139:8)
    at Query.EofPacket (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Query.js:123:8)
    at Protocol._parsePacket (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:279:23) code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }
/mnt/sdb2/WebstormProjects/translator/main.js:36
            if (results[0].f6780 == null){
                       ^

TypeError: Cannot read property '0' of undefined
    at Query._callback (/mnt/sdb2/WebstormProjects/translator/main.js:36:24)
    at Query.Sequence.end (/mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/sequences/Sequence.js:88:24)
    at /mnt/sdb2/WebstormProjects/translator/node_modules/mysql/lib/protocol/Protocol.js:225:14
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)

o 使用 javascript 的异步流程做一些事情。我该如何解决?

标签: javascriptmysqlnode.jsdatabaseasynchronous

解决方案


事实证明,由于 javascript 中的异步流程,我connection.end();在从数据库中获取数据之前到达。所以这是一个解决我的问题的解决方法:

function fetch_data(id){
    connection.query({
            sql: 'SELECT * FROM `bank114_x` WHERE `id` = ?',
            timeout: 40000, // 40s
        },
        [id],
        function (error, results, fields) {
            if (results[0].f6781 == null){
            //send f6780 column to a webservice to calculate f6781
        }
        }
    );
    if (id == total_rows)
    {
        connection.end();
    }
}

推荐阅读