Не могу записать данные в переменную (async, await)

Не могу получить данные из ДБ.

const {Router} = require('express');
const router = Router();
const sqlite = require('sqlite3').verbose();
const path = require('path');
const dbPath = path.join('data', 'data.db');

router.post('/data', async (req, res) => {
  const db = new sqlite.Database(dbPath);
  const { page } = req.headers;
  const firstItemOnPage = page * 50 - 50;

  let data = []

  db.all(`SELECT * FROM users LIMIT ${firstItemOnPage}, 50`, [], (err, row) => {
    if(err) {
      throw err;
    }
    data = row;
    // Ожидаю, что данные будут записаны в переменную, но запрос к ДБ ещё не обработан и код пошёл дальше.
    // Как быть? Может Генераторы?
  })

  res.json(data);
  db.close();
})

module.exports = router;

На front приходит только []. Я примерно понимаю, что это связано с асинхронностью, но как это поправить я не нашёл, мучаюсь 5-й день. Не судите строго, я новенький XD.


Ответы (1 шт):

Автор решения: Bogdan Pryvalov

Можно просто вставить отправку ответа с сервера внутрь запроса в базу и тогда нормально отрабатывать будет или обернуть запрос в базу в промис и авейтом ждать пока отработает функция и уже чтото делать с результатом.

router.post('/data', async (req, res) => {
  const db = new sqlite.Database(dbPath);
  const { page } = req.headers;
  const firstItemOnPage = page * 50 - 50;

  let data = []

  db.all(`SELECT * FROM users LIMIT ${firstItemOnPage}, 50`, [], (err, row) => {
    if(err) {
      throw err;
    }
    data = row;
    res.json(data);
  })
  db.close();
})

//Или 
router.post('/data', async (req, res) => {
  const db = new sqlite.Database(dbPath);
  const { page } = req.headers;
  const firstItemOnPage = page * 50 - 50;

  let data = [];
  
  let result = await example(db, firstItemOnPage);
  
  data.push(result);
  
  res.json(data);
  db.close();
})

example = (db, firstItemOnPage) => {
    return new Promise((resolve, reject) => {
        db.all(`SELECT * FROM users LIMIT ${firstItemOnPage}, 50`, [], (err, row) => {
            if (error) {
                reject('Error');
            } else {
                resolve(row);
            }
        });
    });
}

→ Ссылка