Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何一直等待嵌套函数向父函数返回值_Javascript_Node.js_Function_Async Await_Callback - Fatal编程技术网

Javascript 如何一直等待嵌套函数向父函数返回值

Javascript 如何一直等待嵌套函数向父函数返回值,javascript,node.js,function,async-await,callback,Javascript,Node.js,Function,Async Await,Callback,下面是一段代码。我总是在数据库查询完全执行之前运行valid变量的最后一个返回语句时获得valid的初始值 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, [user

下面是一段代码。我总是在数据库查询完全执行之前运行
valid
变量的最后一个返回语句时获得
valid
的初始值

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;
        });

    }

解决此问题的一种方法是将
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')
    }

}

你能编辑你的问题并添加实际代码而不是图片吗?@eol i hv添加了代码