Javascript 为什么wait即使在异步函数中也不起作用

Javascript 为什么wait即使在异步函数中也不起作用,javascript,node.js,promise,Javascript,Node.js,Promise,我创建了一个通过电子邮件id搜索用户的函数。我使用wait在异步函数中调用该函数,并将返回值赋给或常量/变量,但在打印常量/变量时未定义 function search(email) { sql = `SELECT email FROM users WHERE email = '${email}'`; db.query(sql, (err, res) => { if (err) { console.log(err);

我创建了一个通过电子邮件id搜索用户的函数。我使用wait在异步函数中调用该函数,并将返回值赋给或常量/变量,但在打印常量/变量时未定义

function search(email) {
    sql = `SELECT email FROM users WHERE email = '${email}'`;
    db.query(sql, (err, res) => {
        if (err) {
            console.log(err);
        }
        else {
            return res[0].email;
        }
    })
}

const auth = async (req, res, next) => {
    try {
        const token = req.header('Authorization').replace('Bearer', '');
        const decoded = jwt.verify(token, 'catisdoguniversaltruth');
        const user = await search(decoded._id);
        console.log(user);
        if (!user) {
            throw new Error();
        }
        next();
    }
    catch (e) {
        res.status(401).send("Not Authenticated, Please login");
    }
};

module.exports = auth;
您需要将搜索作为承诺,而不是功能

等待承诺的解决

试试这个:

功能搜索电子邮件{ 返回新的PromiseSolve,拒绝=>{ sql=`SELECT email FROM user,其中email='${email}'`; db.querysql,err,res=>{ 如果出错{ 拒绝者; } 否则{ 解析[0]。电子邮件; } } } } 这将作为promise解决,auth将等待


您还可以将搜索构建为异步/等待承诺。只要您返回承诺解决,这并不重要。

尽管此答案可以解决问题,但如果db.query api有返回承诺的重载,只需返回db.querysql也可以解决问题。@planet\u hunter感谢此插件。谢谢,这解决了我的问题!