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

Javascript 问题:尝试包装mysql查询以在NodeJS/Express上使用它,javascript,mysql,node.js,express,Javascript,Mysql,Node.js,Express,我的目标是包装MySQL查询,将参数传递给一个函数,另一个函数执行MySQL任务,返回结果 以下是我目前的代码: //mysql lib var mysql = require('mysql'); //database credentials exports.pool = mysql.createPool({ connectionLimit: 50, host: 'localhost', user: 'root', password: 'password', database: '_app',

我的目标是包装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;

};
上面的代码返回未定义的
。我无法使这个函数正常工作

我尝试了
console.log(结果)
。这个查询就像一个符咒。我唯一不能做的就是从外部函数中获取结果

//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函数中

//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的
然后
方法并返回结果。按如下方式做

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

您没有在selectOneField函数中返回承诺,它必须返回承诺,而且您不能简单地这样做

rtf=db_u.selectOneField('view_expiredusers','cod','cod',cod)

。您必须使用异步等待或

必须这样处理

//用于测试的包装函数
var selectOneField=exports.selectOneField=function(tbl,field,pk,pkval){
var qry=“从“+tbl+”中选择“+field+”,其中“+pk+”='“+pkval+”;
返回返回结果集(qry)。然后(函数(结果){
返回结果;
}).catch(错误){
日志(“错误:+错误”);
})
};
//…在另一个页面上,我希望能够接收上述函数的结果:
var isExpired=exports.isExpired=function(cod){
var rtf=db_u.selectOneField('view_expiredusers','cod','cod',cod)。然后(rtf=>{
控制台日志(rtf);
返回rtf;
});

};
您也应该在catch块中执行
拒绝(err)
。您没有在selectOneField函数中返回承诺,它必须是returnResultset(…),而且您不能简单地执行rtf=db\uu.selectOneField('view\u expiredusers','cod','cod cod)。您必须使用async wait或thenOk,因此我按照Bear Nithi先生的建议,在reject()和resolve()之前删除了“return”。我也做了你建议的改变,阿兹先生。到目前为止,我得到的是:var cod_customer=1;var isexpired=isexpired(cod_客户);console.log(isexpired);以上返回“未定义”。值得一提的是,查询是有效的,除isExpired()之外的所有函数都正确返回结果。添加并返回带有resolve和reject的函数是一种很好的做法,因此不要删除它,您可以用新问题更新问题吗?在回答中已经解释过,您无法直接从promise获得响应,你必须使用。然后或异步等待。是的,你做对了,阿兹先生。然而,为了理解我做错了什么,我必须真正“看到”正确的代码。无论如何,我也对你的答案投了更高的票。我按照你的建议删除了reject()和resolve()之前的“return”。仍然不起作用=/我已删除该答案,并添加了一个新答案。请检查好了,我完全按照你说的做了,先生:var cod_customer=1;var isexpired=isexpired(cod_客户);console.log(isexpired)//返回'indefined'=(我再次更新了我的答案,您应该再次通过承诺,并在调用isExpiredOk时使用then方法,再次按照您告诉我的那样做,先生。现在console.log显示“承诺{}”