node.js 从 mysql 查询中获取结果

Pav*_*iev 6 mysql node.js

为什么我得不到结果?

var sql_data = connection.query(sql, function(error, results, fields) {
    if(error) {
        console.log(error);
            return;
    }
    var rows = JSON.parse(JSON.stringify(results[0]));
    console.log(rows);
});
console.log(rows);
Run Code Online (Sandbox Code Playgroud)

第一个 console.log 没问题,显示对象,但第二个说:

参考错误:行未定义

怎么了?..

pio*_*ias 8

您不应该像在代码的第一行中那样将异步函数分配给变量。您只需调用它并使用callback方法对结果执行操作(在本例中为function(error, results, fields)。您的代码应如下所示

connection.query(sql, function(error, results, fields) {
    if(error) {
        console.log(error);
        return;
    }
    var rows = JSON.parse(JSON.stringify(results[0]));

    // here you can access rows
    console.log(rows);
});

// here it will be undefined
console.log(rows);
Run Code Online (Sandbox Code Playgroud)

所述rows在第二可变console.log,因为它在不同的范围内定义是不确定的。即使你会在var rows之上做connection.query,它仍然是未定义的,因为你在异步函数的回调中分配了它的值。您需要阅读有关此类操作的更多信息。


Mar*_*zel 6

如果你想得到查询结果,你应该使用then Promise 。我更喜欢它是一个。Promise 异步运行命令。

function getDomain() {
    return result = await dbQuery('SELECT name FROM virtual_domains ORDER BY id;');
}

// * Important promise function
function dbQuery(databaseQuery) {
    return new Promise(data => {
        db.query(databaseQuery, function (error, result) { // change db->connection for your code
            if (error) {
                console.log(error);
                throw error;
            }
            try {
                console.log(result);

                data(result);

            } catch (error) {
                data({});
                throw error;
            }

        });
    });

}
Run Code Online (Sandbox Code Playgroud)