为什么即使在异步功能中使用时,等待也无法正常工作

时间:2019-03-18 11:37:44

标签: javascript node.js promise

我提供了一个通过电子邮件ID搜索用户的功能。我正在使用await在异步函数中调用该函数,并将返回值分配给或常量/变量,但是在打印常量/变量时变得不确定

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;

1 个答案:

答案 0 :(得分:5)

您需要INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from A:\Code\Machine Learning\Software Engineering project\Quick Draw\Model Checkpoints\model.ckpt-0 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Saving checkpoints for 0 into A:\Code\Machine Learning\Software Engineering project\Quick Draw\Model Checkpoints\model.ckpt. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2019-03-23-22:28:00 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from A:\Code\Machine Learning\Software Engineering project\Quick Draw\Model Checkpoints\model.ckpt-0 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2019-03-23-22:28:02 INFO:tensorflow:Saving dict for global step 0: accuracy = 0.0, global_step = 0, loss = 0.0 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 0: A:\Code\Machine Learning\Software Engineering project\Quick Draw\Model Checkpoints\model.ckpt-0 INFO:tensorflow:Loss for final step: None. 是一个承诺而不是一个功能。

search()等待一个诺言解决。

尝试一下:

await

这将作为承诺解决, function search(email){ return new Promise((resolve, reject) => { sql = `SELECT email FROM users WHERE email = '${email}'` db.query(sql, (err, res)=>{ if(err){ reject(err); } else{ resolve(res[0].email) } }) } 将等待。

您也可以按照auth()的承诺建立search()。只要您返回承诺解决方案,就不会真的感到困惑。