Проблема обещаний: Попытка обернуть запросы MySQL, чтобы использовать его на NodeJS / Express - PullRequest
0 голосов
/ 05 марта 2019

Моя цель - обернуть запросы 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).Запрос работает как шарм.Единственное, что я не могу получить на работе, это поймать результат с помощью внешней функции.

Есть мысли?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

вы не возвращаете обещание в функции selectOneField, оно должно возвращать обещание, а также вы не можете просто сделать

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


};
0 голосов
/ 05 марта 2019

Вы должны вернуть обещание и связать его внутри функции 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 в других файлах, вы должны использовать метод обещания then и вернуть результаты.сделать это следующим образом

var cod_customer = 1;
var isexpired;
 isExpired(cod_customer).then(function (results) {
        isexpired = results;
        console.log(isexpired);
    }, function (error) {
        console.log("Error: " + error);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...