Как вернуть данные из экспресс-запроса, выполнив асинхронные запросы sqlite3 в цикле? - PullRequest
0 голосов
/ 17 мая 2019

Я очень плохо знаком с NodeJS и Express и изо всех сил пытаюсь использовать sqlite3 модуль.

Предположим, у меня есть база данных с 2 таблицами: машины , car_details .
Это простой пример того, что я пытаюсь сделать:

router.get('/get-car-info', (req, res) => {
    let car_details = [];
    let sql = '';
    let cars = ['audi', 'bmw', 'benz', 'honda', 'toyota];

    cars.forEach(car => {
        sql = `SELECT * FROM car_details WHERE name=${car}`;

        db.get(sql, function(err, data) {
            if (!err) {       
                car_details.push(data);
            }
        });
    });

    res.json({ 'success': true, 'cars': car_details });
});

Это базовый пример, но его достаточно, чтобы описать проблему.
Поскольку db.get является асинхронным запросом, к моменту завершения цикла ответ будет пустым, поскольку он вызывается до завершения запросов.

Если бы был только один запрос, то нормально, я бы отправил ответ в callback, но не уверен, как этого добиться при наличии ситуации цикла / рекурсии.

Заранее спасибо ...

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Вы можете сделать что-то вроде этого ... но, пожалуйста, проверьте результат car_details, я надеюсь, что каждый db.get запросит возврат данных напрямую ..

   router.get('/get-car-info', async (req, res) => {
        let sql = '';
        let cars = ['audi', 'bmw', 'benz', 'honda', 'toyota];    
        let car_details = await Promise.all(cars.map(car => {
            sql = `SELECT * FROM car_details WHERE name=${car}`;
            return db.get(sql);
        }));

        res.json({ 'success': true, 'cars': car_details });
    });
0 голосов
/ 17 мая 2019

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

router.get('/get-car-info', (req, res) => {
      let car_details = [];
      let cars = ['audi', 'bmw', 'benz', 'honda', 'toyota];

      function inParam(sql, arr) {
        return sql.replace('?#', arr.map(() => '?').join(','))
      }

      db.get(inParam('SELECT * FROM car_details WHERE name in (?#)', car), car, function(err, data) {
        if (!err) {
          console.log(data)
          car_details.push(data);
        }
      });
 });
...