При использовании SQLite3 и ExpressJs, как мне убедиться, что app.get () не является асинхронным при вызове метода db.each ()? - PullRequest
1 голос
/ 11 января 2020

У меня есть некоторый код переднего плана, который будет делать запрос GET к URL "/ api / classes". После запуска мой ExpressJs сервер загрузит мою базу данных SQLite3, затем прочитает запрос и, наконец, сохранит результат внутри объекта и вернет его. Я использую метод db.each () для l oop моей базы данных. Я знаю, что мой l oop работает из-за строк шаблона console.log. Проблема в том, что когда я использую PostMan, я вижу, что res.send () вызывается немедленно, что возвращает пустой объект. Как сделать так, чтобы res.send () вызывался после db.each ()? Я знаю, что db.each () принимает обратный вызов, поэтому я попытался поместить res.send () в качестве аргумента, но это не сработало.

Вот мой код:

const express = require('express');
let sqlite3 = require('sqlite3').verbose();
const app = express();

app.get('/api/classes', (req, res) => {
    let classes = {}
    let db = new sqlite3.Database('./classes.db', (err) => {
        if (err) {
            console.error(err.message);
        }
        console.log('Connected to the classes database.');
    });   
    let sql = `SELECT CRS_CDE course_code,
                  CRS_TITLE course_name,
                  Column3 start_time,
                  Column4 end_time
            FROM spring_schedule
            WHERE CRS_TITLE IN `;

    let classNames = ['Spanish I', 'Accounting II', 'College Algebra']
    let where = '(?' + ',?'.repeat(classNames.length-1) + ')';
    sql += where;

    db.each(sql, [...classNames], (err, row) => {
        if (err) throw err;
        console.log(`${row.course_code} + ${row.course_name} +  ${row.start_time} - ${row.end_time}`);
        classes[row.course_code] = row.course_name
    });
    db.close();
    res.send(classes)
});

const port = 5000;
app.listen(port, () => console.log(`Server started on port ${port}`));

1 Ответ

1 голос
/ 11 января 2020

Функция each имеет [полный] обратный вызов в соответствии с api docs здесь , поэтому ваш пример должен выглядеть следующим образом:

   db.each(sql, [...classNames], (err, row) => {
    if (err) {
    throw err;
    }
    console.log(`${row.course_code} + ${row.course_name} +  ${row.start_time} -              
     ${row.end_time}`);

    classes[row.course_code] = row.course_name

  }, () => {

          res.send(classes)

      });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...