использование async / await для sql вставки данных - PullRequest
0 голосов
/ 18 марта 2020
function Recursive_scan_and_Insert (path_dir) { //scanning path_dir recursively and insert filepath into temporary list
    Recursive_Scan(path_dir, (err, files) => { //it's from npm recursive_readdir
        if(err) {
            console.log(err);
            res.status(500).send('server error');
        }

        files.forEach(elements => {
            let params = [elements]; //
            DB("GET", "INSERT INTO filelist_t VALUES (null, ?, NOW(), 0, 0)", params).then(function(res) {
                console.log('data input');
            });
        });
    });
};

function Add_to_DB () { //moving temporal list to main list without duplicate
    DB("GET", "INSERT INTO filelist (id, path, addeddate, isdeleted, ismodified) SELECT NULL, filelist_t.path, filelist_t.addeddate, filelist_t.isdeleted, filelist_t.ismodified FROM filelist_t LEFT JOIN filelist ON filelist.path = filelist_t.path WHERE filelist.id IS NULL; DELETE FROM filelist_t; ").then(function(res) {
        console.log('data moving');
    });
};


app.get('/db', (req, res) => { //PROBLEM PART

    async function async_Two_Functions () {
        var object_path = '/want/to/scan/path';
        await Recursive_scan_and_Insert(object_path).then( () => {
            return Add_to_DB()
        })
    }
    async_Two_Functions();
    res.send(res);
});

app.get('/dbp', (req, res) => { //show main list to my web
    DB("GET", "SELECT * FROM filelist").then(function(res2) {
        res.send(res2.row);
    });
});

вот в чем дело.

есть 4 этапа в алгоритме моего сна.

  1. рекурсивно сканирует все пути.
  2. вставляет все данные в временная таблица.
  3. перемещение временных данных на главном столе без дублирования
  4. представление основной таблицы

это очень важно, чтобы вещи получили порядок. но я не совсем понимаю насчет async await ... 1018 *

1 Ответ

2 голосов
/ 18 марта 2020

Ну, вот очищенная версия кода с множеством изменений.

const {promisify} = require('util');
const Recursive_ScanP = promisify(Recursive_Scan);

function Recursive_scan_and_Insert(path_dir) { //scanning path_dir recursively and insert filepath into temporary list
    return Recursive_ScanP(path_dir).then(files => {
        return Promise.all(files.map(elements => {
            let params = [elements];
            return DB("GET", "INSERT INTO filelist_t VALUES (null, ?, NOW(), 0, 0)", params).then(function(res) {
                console.log('data input');
                // what should the return value be here?
            });
        }));
    });
};

function Add_to_DB () { //moving temporal list to main list without duplicate
    return DB("GET", "INSERT INTO filelist (id, path, addeddate, isdeleted, ismodified) SELECT NULL, filelist_t.path, filelist_t.addeddate, filelist_t.isdeleted, filelist_t.ismodified FROM filelist_t LEFT JOIN filelist ON filelist.path = filelist_t.path WHERE filelist.id IS NULL; DELETE FROM filelist_t; ").then(function(res) {
        console.log('data moving');
        return res;
    });
};


app.get('/db', async (req, res) => {
    try {
        let object_path = '/want/to/scan/path';
        await Recursive_scan_and_Insert(object_path);
        await Add_to_DB();
        res.send(somethingHere);        // you fill in what response you want to send here
    } catch(e) {
        console.log(e);
        res.status(500).send("Server Error");
    }
});

app.get('/dbp', (req, res) => { //show main list to my web
    DB("GET", "SELECT * FROM filelist").then(function(res2) {
        res.send(res2.row);
    }).catch(err => {
        console.log(err);
        res.status(500).send("Server Error");
    });
});

Изменения:

  1. Возвращает обещание от каждой функции, которая выполняет асинхронную операцию в it
  2. Возвращать любое обещанное значение для обещания от каждого .then() обработчика
  3. Обещать все, что использует обычный обратный вызов, чтобы вы могли выполнять весь поток управления с обещаниями
  4. Используйте Promise.all(), чтобы знать, когда выполняются несколько обещаний, и собирать результаты для выполнения параллельного набора асинхронных операций
  5. Используйте async/await по желанию, но особенно, если вы хотите упорядочить несколько асинхронные операции
  6. Используйте try/catch вокруг любого await, чтобы поймать отклоненное обещание, которое не возвращается на более высокий уровень, где они будут пойманы
  7. Используйте .catch() с любым .then() это не возвращается на более высокий уровень, где его поймают

Открытые вопросы:

  1. Не знаю, какой ответ вы хотите т для отправки от app.get('/db', ...). Вам нужно будет это заполнить.
  2. Ожидаете ли вы какого-либо разрешенного значения от Recursive_scan_and_Insert()?
  3. Действительно ли Add_to_DB() не принимает ввод? Это просто реорганизует вещи уже в базе данных?
...