Один из способов исправить это - заключить в обещание 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')
}
}