Не работает await nodejs

237
10 февраля 2020, 03:20

Имеются две функции:

exports.userCheck = async (user) => {
   try {
       dbUser = await exports.findByLogin(user.login);
       if (!checkPassword(dbUser, user.password))
           return false;
       else return dbUser;
   } catch (err) {
       console.log("ERRORDBG: " + err);
   }
}
exports.findByLogin = (login) => {
   console.log(login);
   sql.query(`SELECT * FROM users 
              WHERE login = '${login}'`, (error, result) => {
       if (error) console.log("Error: " + error.stack);
       console.log(result[0]);
       return result[0];
   });
}

Но, в консоли:

login
ERRORDBG: TypeError: Cannot read property 'password' of undefined
RowDataPacket {
  id: 99,
  login: 'login',
  password: 'password'
}

Из-за порядка вывода данных в консоль, очевидно, что происходящее в sql.query выполняется позже checkPassword. Требуется приостанивить выполнение функции userCheck до полного завершения findByLogin.

PS sql = mysql.createConnection()

node-module mysql

UPD

Попробовал так:

let dbUser = exports.findByLogin(user.login)
    .then(() => {
        console.log(dbUser);
        if (!checkPassword(dbUser, user.password))
            return false;
        else return dbUser;
    })
    .catch(err => console.log(err));

Но выводится: Promise { pending }

Answer 1

Оберните функцию запроса в БД в промис по такому принципу

 exports.userCheck = async (user) => {
   try {
       dbUser = await exports.findByLogin(user.login);
       if (!checkPassword(dbUser, user.password))
           return false;
       else return dbUser;
   } catch (err) {
       console.log("ERRORDBG: " + err);
   }
}
exports.findByLogin = (login) => {
 return new Promise((resolve, reject) => {
   console.log(login);
   sql.query(`SELECT * FROM users 
              WHERE login = '${login}'`, (error, result) => {
       if (error) return reject(error);
       resolve(result);
   });
 }
}
READ ALSO
Как вызвать плагин Cordova используя Vue.js

Как вызвать плагин Cordova используя Vue.js

Я пишу приложение на CordovaСам вид приложения пишу на Vue

205
Ошибка в базе данных JSON

Ошибка в базе данных JSON

Есть начальные данные для каждого аккаунта

211
изменить цвет пункта меню

изменить цвет пункта меню

У меня длинное меню, функция обработки выбранного пункта меню однаУ всех пунктов меню один общий класс и разные id

226