Как продолжить Ожидание вложенной функции для возврата значения в родительскую функцию - PullRequest
1 голос
/ 21 апреля 2020

Ниже приведен фрагмент кода. Я всегда получаю начальное значение переменной valid, поскольку операторы last return выполняются до того, как запрос БД полностью выполнит .

async login(username, password, ctx) {
        let sql = 'SELECT * FROM users WHERE username=?;'

        let valid = false; //I'm always getting this value

        await this.db.query(sql, [username], function(err, rows, fields){
            console.log(rows);
            if(rows.length > 0)
            {
                console.log('coming into');
                console.log(JSON.stringify(rows));
                valid = bcrypt.compare(password, rows[0].pass)
                console.log('valid is ', valid);    
                if(valid === false) throw new Error(`invalid password for account "${username}"`)
                ctx.session.user_id = rows[0].id
                ctx.session.authorised = true
                return ctx.redirect(`/secure?msg=you are now logged in...`)
            }
            else
                throw new Error(`username ${username} not found ${JSON.stringify(rows)}`);

            return valid;
        });

    }

1 Ответ

1 голос
/ 21 апреля 2020

Один из способов исправить это - заключить в обещание db -обращение и подождать, пока это обещание не будет разрешено / отклонено. Затем вы можете либо установить флаг авторизации и перенаправить пользователя, либо обработать ошибку:

async login(username, password, ctx) {

    try {
        const rows = await new Promise((resolve, reject) => {
            let sql = 'SELECT * FROM users WHERE username=?;'
                this.db.query(sql, [username], function (err, rows, fields) {
                    if (rows && rows.length > 0) {
                        console.log('coming into');
                        console.log(JSON.stringify(rows));
                        valid = bcrypt.compare(password, rows[0].pass)
                        console.log('valid is ', valid);
                        if (valid === false) {
                            reject(new Error(`invalid password for account "${username}"`));
                        }
                        return resolve(rows);
                    }
                    reject(new Error(`username ${username} not found ${JSON.stringify(rows)}`); )
                });

        });
        ctx.session.user_id = rows[0].id
        ctx.session.authorised = true
        return ctx.redirect(`/secure?msg=you are now logged in...`)
    } catch (err) {
        // handle your error, e.g. ctx.redirect('/error-page')
    }

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