Почему функция row (callback) из db.all возвращает неопределенное значение, в то время как строки определены? - PullRequest
0 голосов
/ 05 апреля 2019

Я вызываю функцию, чтобы посмотреть, есть ли адрес электронной почты в БД. Это либо пустой, либо заполненный массив. Всякий раз, когда я возвращаю это значение, оно не определено впоследствии. Как я могу решить это? Заранее спасибо!

Я пытался использовать next () и обещания.

Функция, которая вызывает функцию запроса БД.

    const emailExists = async function(req,res,next){
        let emailInDb = await usermodel.getOneByEmail(req, next);
        console.log(emailInDb);
       if(emailInDb.length !==0){
        res.send('email already in use!');
       }
       else{
         return next();
        }
    };

Запрос БД.

    const getOneByEmail = function (req, next){
        let db = new sqlite3.Database(dbPath, (err) => {
        if (err) {
            console.error(err.message);
            }
        console.log('Connected to books db.');
         });

        db.all(`SELECT * FROM users WHERE email = ?`, [req.body.email], 
        (err, rows) => {
             console.log(rows);
             return rows;
         });
     };

console.log (emailInDb) дает неопределенное значение. В то время как console.log (rows) выдает массив с результатами.

1 Ответ

0 голосов
/ 05 апреля 2019

Помещение await перед не асинхронной функцией волшебным образом не заставляет функцию ждать разрешения db-вызовов.Вам нужно заключить db-вызовы в обещание, например:

 const getOneByEmail = (req, next) => {

    return new Promise((resolve, reject) => {
        let db = new sqlite3.Database(dbPath, (err) => {
            if (err) {
                console.error(err.message);
                reject(err);
            }
            console.log('Connected to books db.');           
        });
        db.all(`SELECT * FROM users WHERE email = ?`, [req.body.email],
            (err, rows) => {
                // TODO: check for error here and reject
                console.log(rows);
                resolve(rows);
            });
    });
};

Обратите внимание, что вам не следует подключаться к базе данных каждый раз, когда вы вызываете getOneByEmail, вместо этого повторно используйте соединение ...

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