Как мне связать запросы к базе данных с обещаниями в узле?

#node.js

#node.js

Вопрос:

Я пытаюсь связать серию запросов к базе данных в Node.js используя модуль mysql2.

Прежде всего, я перейду к async / await, но я хочу понять этот метод, прежде чем делать это. Я пытаюсь более подробно разобраться в обещаниях, прежде чем использовать для них то, что, как я понимаю, является синтаксическим сахаром.

Вот мой код:

 const pool = mysql.createPool({
    host: 'localhost',
    user: process.env.MYSQL_USERNAME,
    password: process.env.MYSQL_PASSWORD,
    database: 'phones'
});

console.log(pool);

pool.getConnection((connection) => {
    console.log('entered connection');
    connection.promise().query('select * from lists')
        .then(([rows, fields]) => {
            const lists = rows;
            return connection.promise().query('select * from numbers')
        }).then(([rows, fields]) => {
            const numbers = rows;
            return numbers;
        }).then(() => {
            console.log(lists);
            console.log(numbers);
            return lists;
        }).catch((error) => {
            throw error;
        }).finally(() => {
            connection.end();
        });
});

console.log('end');
 

И вот результат:

 PromisePool {
...
}
end
 

Программа просто ждет там и не завершается, пока я не нажму Ctrl-C. Я понимаю достаточно, чтобы знать, что есть обещание, которое ожидает разрешения, но я не понимаю почему. Разве я не должен хотя бы получить entered connection журнал? Я не.

Комментарии:

1. если вы используете then() цепочку, не забудьте вернуть что-то , чтобы следующему обработчику «then» было с чем работать. Если вы используете функции со стрелками, помните, что возвращаются только функции со стрелками () => 3 (например, возвращает значение 3) — функции со стрелками с функциональным блоком ничего не возвращают , если вы явно не добавите оператор return (например () => { 3; } , ничего не возвращает, это должно быть () => { return 3; } для возврата 3)

2. @Mike’Pomax’Camermans, что я убираю из этого, так это то, что каждый из then вызовов должен что-то возвращать, но я добавил возвращаемые значения к каждому из моих then вызовов, и поведение не изменилось. Вызывается pool.getConnection ли вызываемый? Если да, то почему первая строка в нем не выводится в журнал?

3. ваш код не показывает возвратов.

4. @Mike’Pomax’Camermans я добавил их в свой файл. Но это ничего не меняет. Теперь я добавил их в приведенный выше пример кода. Результат остается тем же, и выполнение не завершается.

5. можете ли вы добавить сюда await — «const pool = await mysql.createPool({ » и проверить, вызывается ли pool.getConnection или нет. Также добавьте поле ошибки в функцию обратного вызова pool.getConnection и проверьте, есть ли какая-либо ошибка или нет.