0

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

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.

Oleksandr
  • 523

1 Answers1

1

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

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); } }); }); }

  • Первый вариант, я пробовал, есть проблема, нужно 2 запроса к БД к 2-м разным таблицам, а вот второй вариант, спасибо, мне очень нравится. Я конечно немного (много) наглею, но можно ли в example вернуть 2 промиса? Я очень новичок. – Oleksandr Apr 19 '20 at 10:05
  • 1
    Смотря что тебе нужно, если исходя из того что ты вытащил зделать еще 1 запрос можешь построить цепочку промисов и через then вызвать 2 функцию которая будет делать другой запрос или опять же просто создай еще 1 example только с другим запросом который тебе нужен и так же с ним работай. – Bogdan Pryvalov Apr 19 '20 at 10:29