NodeJS асинхронные вызовы MySQL препятствуют выходу процесса - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть массив конфигурации, который содержит объекты.На основе свойств в этих объектах строится запрос для каждой строки в массиве.Таким образом, количество выполняемых запросов не является установленным числом.

Данные этих запросов затем необходимо вставить в другую таблицу.Я написал некоторый код, который выполняет это действие, но у меня есть некоторые проблемы с асинхронным поведением NodeJS.Поскольку вызовы MySQL выполняются асинхронно, процесс NodeJS не завершается правильно.Если я сам закрою процесс в конце скрипта, не все вызовы MySQL будут обработаны.

Я подозреваю, что мне придется где-то использовать обещания, но я не настолько знаком с ними.

Вот что у меня уже есть.В настоящее время он написан очень синхронно, но это то, с чем я сейчас наиболее знаком.

    require('dotenv').config();

    const mysql = require('mysql');
    const db = mysql.createConnection({
        host: process.env.DB_HOST,
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_DATABASE,
    });

    let items = [
            {"type": "A", "col1": "test"},
            {"type": "B", "col1": "lorem"}
    ];

    let lastId = 0;

    for (let item of items) {
        console.log(item);
        let query = 'SELECT * FROM testtable1 WHERE id > ? ';
        let queryParams = [lastId];

        for (let itemProp in item) {
            if (item.hasOwnProperty(itemProp)) {
                query += ' AND ' + itemProp + ' = ?';
                queryParams.push(item[itemProp]);
            }
        }
        console.log(db.format(query, queryParams));
        db.query(query, queryParams, (err, results, fields) => {
            if (err) throw err;
            if (results.length > 0) {
                for (let row of results) {
                    let rowData = {
                        col1: row.col1,
                        col2: row.col2
                    };
                    db.query('INSERT INTO testtable2 SET ?', rowData, (err, res) => {})
                }
            }
        });
    }

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Итак, в конечном итоге я создал обещание для каждого элемента цикла for и поместил их в массив, а затем использовал следующий код, чтобы убедиться, что все обещания были разрешены до завершения соединения с базой данных:

Promise.all(promises).then(() => db.end());

0 голосов
/ 18 февраля 2019

Поскольку ваше соединение открыто с сервером MySQL, программа не будет выходить.
Вы должны вызвать db.end(), чтобы закрыть соединение и позволить программе выйти.Смотри документацию здесь: https://github.com/mysqljs/mysql/blob/master/Readme.md#terminating-connections

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...