承诺问题:尝试包装mysql查询以在NodeJS / Express上使用它

问题描述 投票:1回答:2

我的目标是包装MySQL查询,将参数传递给函数,另一个函数执行MySQL作业,返回结果。

到目前为止,这是我的代码:

//mysql lib
var mysql = require('mysql');

//database credentials
exports.pool = mysql.createPool({
connectionLimit: 50,
host: 'localhost',
user: 'root',
password: 'password',
database: '_app',
debug: false
});

//my wrapper =(
var returnResultset = exports.returnResultset = function (qry) {
return new Promise(function (resolve, reject) {
    try {

        mysql_.pool.getConnection(function (err, connection) {

            if (err) {
                console.log("Error on function returnResultset - MYSQL ERROR: " + err);
                return reject(err);
            }

            connection.query(qry, [], function (error, results, fields) {

                connection.release();

                if (error) {
                    console.log("Error on function returnResultset - MYSQL ERROR: " + error);
                    return reject(error);
                }

                return resolve(results);

            });

        });

    }
    catch (e) {
        console.log('error:' + e);
    }
});

};

//wrapper function for testing purposes
var selectOneField = exports.selectOneField = function (tbl, field, pk, pkval) {

var qry_ = "SELECT  " + field + " FROM " + tbl + " WHERE " + pk + " = '" + pkval + "'";

returnResultset(qry_).then(function (results) {
    return results;
}, function (error) {
    console.log("Error: " + error);
})

};

//...and on another page I want to be able to receive the results from the function above:

var isExpired = exports.isExpired = function (cod) {

var rtf = db_.selectOneField('view_expiredusers', 'cod', 'cod', cod);

console.log(rtf);

return rtf;

};

上面的代码返回undefined。我无法让这个功能正常工作。

我试过console.log(results)。查询就像一个魅力。我唯一无法工作的是从外部函数中捕获结果。

有什么想法吗?提前致谢!

javascript mysql node.js express
2个回答
2
投票

您应该返回promise并将其链接到isExpired函数中。

//wrapper function for testing purposes
var selectOneField = exports.selectOneField = function (tbl, field, pk, pkval) {

var qry_ = "SELECT  " + field + " FROM " + tbl + " WHERE " + pk + " = '" + pkval + "'";

return returnResultset(qry_);

};

//...and on another page I want to be able to receive the results from the function above:

var isExpired = exports.isExpired = function (cod) {

return db_.selectOneField('view_expiredusers', 'cod', 'cod', cod)



};

当您在其他文件中调用isExpired时,您应该使用promise的then方法并返回结果。这样做

var cod_customer = 1;
var isexpired;
 isExpired(cod_customer).then(function (results) {
        isexpired = results;
        console.log(isexpired);
    }, function (error) {
        console.log("Error: " + error);
    });

1
投票

你没有在selectOneField函数中返回promise,它必须返回promise并且你也不能这样做

rtf = db_.selectOneField('view_expiredusers','cod','cod',cod);

你将不得不使用async-await

必须以这种方式处理

//wrapper function for testing purposes
var selectOneField = exports.selectOneField = function (tbl, field, pk, pkval) {

var qry_ = "SELECT  " + field + " FROM " + tbl + " WHERE " + pk + " = '" + pkval + "'";

return returnResultset(qry_).then(function (results) {
    return results;
}).catch(error) {
    console.log("Error: " + error);
})

};

//...and on another page I want to be able to receive the results from the function above:

var isExpired = exports.isExpired = function (cod) {

var rtf = db_.selectOneField('view_expiredusers', 'cod', 'cod', cod).then(rtf => {
console.log(rtf);

return rtf;
});


};
© www.soinside.com 2019 - 2024. All rights reserved.