NodeJS MySQL Async-将对象返回给调用者函数

时间:2017-01-30 17:00:51

标签: javascript node.js asynchronous callback return

我是NodeJS的新手,我正在努力寻找一个解决方案来创建一个可重用的函数来执行查询(通过参数传递),然后简单地将响应返回给调用者。我想这样做,因为将有超过100个函数需要数据库查询,它将有助于减少代码大小。

我尝试了以下作为非常原始的测试,但dbA_Read_Data()函数始终返回undefined,因为它是异步的。然而,6天之后,超过15种替代回调/承诺解决方案对某些人起作用并没有对我有用,我也没有更接近解决这个问题并完成以下任务。

const { Databases } = require('../../utils/enums');
var mysql = require('mysql');


function getAllUsers() {
    //This function would be called when an endpoint is hit in my HapiJS system.
    var myQuery = "SELECT * FROM Users WHERE Account_Status== 'ACTIVE' ";
    var response = dbA_Read_Data(myQuery);

    return response;
}




//dbA => website database, contains users/permissions/etc
//Other databases... you get the idea

function dbA_Read_Data(query) {
    dbConn = createConnection("localhost", Databases.db_A.name, Databases.db_A.username, Databases.db_A.password);

    dbConn.connect();
    dbConn.query(query, function(err, rows, fields) {
        if (err) throw err;
        var myResponseObject = {
            query: query,
            data: {
                count: rows.length,
                records: rows
            }
        }
    });
}



function createConnection(host, database, user, password) {
    var connection = mysql.createConnection({
        host: host,
        user: user,
        password: password,
        database: database
    });

    return connection;
}

如何让函数dbA_Read_Data(query)将响应对象返回给调用函数?

1 个答案:

答案 0 :(得分:1)

与注释部分一样,数据库调用conn.query是异步的,因此无法简单地返回结果。为了获得此查询的结果并对其进行操作,您可以使用Promise。

我认为你的dbA_Read_Data(query)函数看起来像这样:

function dbA_Read_Data(query){
    var dbConn = createConnection("localhost", Databases.db_A.name, Databases.db_A.username, Databases.db_A.password);

    dbConn.connect();

    return new Promise(function(resolve, reject){

        dbConn.query(query, function(err, rows, fields) {
            if ( err ) {
                reject(err);
            } else {
                var myResponseObject = {
                    query: query,
                    data: {
                        count: rows.length,
                        records: rows
                    }
                }

                resolve(myResponseObject);
            }
        });

    });
}

然后,您的getAllUsers()函数调用需要.then()才能获得结果:

function getAllUsers(){
    var myQuery = "SELECT * FROM Users WHERE Account_Status== 'ACTIVE' ";

    return dbA_Read_Data(myQuery).then(function(result){
        return result;
    }).catch(function(error){
        // handle the error properly here...
        console.log('error in database operation');
    });
}

getAllUsers().then(function(users){
    // do something with the result...
    console.log(users);
});