Не могу записать данные в переменную (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);
}
});
});
}