【问题标题】:Promises problem: Trying to wrap mysql queries to use it on NodeJS / ExpressPromises 问题:尝试包装 mysql 查询以在 NodeJS/Express 上使用它
【发布时间】:2019-07-26 13:20:16
【问题描述】:

我的目标是包装 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)。查询就像一个魅力。我唯一不能开始工作的就是从外部函数中捕获结果。

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

【问题讨论】:

  • 你也应该在你的 catch 块中做reject(err)
  • 您没有在 selectOneField 函数中返回承诺,它必须返回 returnResultset(...) 并且您不能简单地执行 rtf = db_.selectOneField('view_expiredusers', 'cod', 'cod' , 鳕鱼); .你将不得不使用异步等待或然后

标签: javascript mysql node.js express


【解决方案1】:

您应该返回承诺并将其链接到 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);
    });

【讨论】:

  • 我按照您的建议删除了reject() 和resolve() 之前的“return”。还是不行=/
  • 我已删除该答案,并添加了一个新答案。请检查一下
  • 嗯,我完全按照你说的做了,先生:var cod_customer = 1; var isexpired = isExpired(cod_customer); console.log(isexpired);//returns 'indefined' =(
  • 我再次更新了我的答案,你应该再次通过承诺,并在调用 isExpired 时使用 then 方法
  • 好的,再次按照您告诉我的去做,先生。现在 console.log 显示“Promise { }”
【解决方案2】:

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

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

.你将不得不使用 async-await 或 then

必须这样处理

//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;
});


};

【讨论】:

  • 好的,所以我按照 Bear Nithi 先生的建议删除了 reject() 和 resolve() 之前的“return”。我也做了你建议 AZ_ 先生的改变。这是我到目前为止得到的: var cod_customer = 1; var isexpired = isExpired(cod_customer); console.log(过期);以上返回“未定义”。值得一提的是,查询是有效的,除了 isExpired() 之外的所有函数都正确返回了结果。
  • 添加并返回解决和拒绝是一个好习惯,所以不要删除它,你能用新问题更新问题吗?
  • 已经在回答中解释说你不能直接从promise得到响应,你必须使用.then或async await
  • 是的,AZ_ 先生,你没看错。但是,我必须真正“看到”正确的代码才能理解我做错了什么。无论如何,我也赞成你的回答。
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2020-02-01
  • 2013-03-07
  • 2012-05-01
  • 2017-09-28
  • 2016-02-27
相关资源
最近更新 更多