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

Есть предположения? Заранее спасибо!


person Fabricio Ganzert    schedule 05.03.2019    source источник
comment
Вы также должны сделать reject(err) в своем блоке catch.   -  person jayarjo    schedule 05.03.2019
comment
вы не возвращаете обещание в функции selectOneField, оно должно быть return returnResultset(...), а также вы не можете просто сделать rtf = db_.selectOneField('view_expiredusers', 'cod', 'cod', треска); . вам придется использовать асинхронное ожидание или затем   -  person AZ_    schedule 05.03.2019


Ответы (2)


Вы должны вернуть обещание и связать его внутри функции 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);
    });
person Bear Nithi    schedule 05.03.2019
comment
Я удалил «возврат» перед reject() и resolve(), как вы предложили. Все равно не работает =/ - person Fabricio Ganzert; 05.03.2019
comment
Я удалил этот ответ и добавил новый ответ. Пожалуйста, проверьте это - person Bear Nithi; 05.03.2019
comment
Что ж, я сделал именно так, как вы сказали, сэр: var cod_customer = 1; var isexpired = isExpired(cod_customer); console.log(isexpired);//возвращает 'indefined' =( - person Fabricio Ganzert; 05.03.2019
comment
Я снова обновил свой ответ, вы должны снова передать обещание и использовать метод then при вызове isExpired - person Bear Nithi; 05.03.2019
comment
Хорошо, опять же, сделал, как вы мне сказали, сэр. Теперь в console.log написано Promise { ‹ожидание› } - person Fabricio Ganzert; 05.03.2019
comment
isexpired — это обещание, поэтому console.log(isexpired) напечатает полный неразрешенный объект обещания. - person AZ_; 05.03.2019
comment
когда вы используете промисы, вы должны использовать console.log() внутри метода then, я снова обновил его. bcz javascript асинхронный - person Bear Nithi; 05.03.2019
comment
@BearNithi JavaScript асинхронный? stackoverflow.com/questions/16523870 / - person AZ_; 05.03.2019
comment
Мистер Медведь, это помогло. Получил результат, как и предполагалось. Сначала это так сбивает с толку, как работать с промисами, потому что я привык иметь дело с функциями синхронизации. Новые земли, многому предстоит научиться. Вы спасаете жизнь, мистер Медведь! - person Fabricio Ganzert; 05.03.2019

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

rtf = db_.selectOneField('view_expiredusers', 'треска', 'треска', треска);

. вам придется использовать 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;
});


};

person AZ_    schedule 05.03.2019
comment
Итак, я удалил «возврат» перед reject() и resolve(), как предложил г-н Медведь Нити. Я также внес изменения, которые вы предложили, мистер AZ_. Вот что я получил на данный момент: var cod_customer = 1; var isexpired = isExpired(cod_customer); console.log(истек срок действия); Вышеприведенное возвращает «неопределенное». Стоит отметить, что запрос действителен, и все функции, кроме isExpired(), возвращают результат правильно. - person Fabricio Ganzert; 05.03.2019
comment
добавление и возврат с разрешением и отклонением - это хорошая практика, поэтому не удаляйте это, не могли бы вы обновить вопрос с помощью новой проблемы? - person AZ_; 05.03.2019
comment
в ответе уже объяснено, что вы не можете напрямую получить ответ от обещания, вам придется использовать .then или async await - person AZ_; 05.03.2019
comment
Да, вы правильно поняли, мистер AZ_. Однако мне пришлось «увидеть» правильный код, чтобы понять, что я делаю неправильно. В любом случае, я тоже проголосовал за ваш ответ. - person Fabricio Ganzert; 05.03.2019