Console Error: await is only valid in async functions and the top level bodies of modules

Console Error: await is only valid in async functions and the top level bodies of modules

我正在 nodejs 中创建登录功能,我想通过哈希将密码存储在 mysql 数据库中: 我正在使用 bcrypt 库。

bcrypt.hash(password, 10, function(err, hash) {
            console.log(hash);
});

上面的代码对我来说工作正常,但如果我想像下面这样使用 await

let hashedPassword = await bcrypt.hash(password,10);

它显示以下错误为

let hashedPassword = await bcrypt.hash(password,10);
                           ^^^^^
SyntaxError: await is only valid in async functions and the top level bodies of modules

注意:我的目标是以异步方式使用它,所以使用 await。而疑问是,

  1. 第一个异步工作
  2. 第二个是我从视频中得到的,它可以工作,但在我的情况下不行,所以这里有什么问题

以下是详细信息的总控制器代码:

const db = require("../connection");

const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');

exports.register = (req,res) => {
    const {name, email, password, cpassword} = req.body;

    db.query('SELECT * FROM users WHERE email=?', [email],(error,result)=>{

         if(error){
             console.log(error);
         } else if(result.length > 0){
             return res.render('signup',{
                 message:'Email already exists!'
             })
         } else if(password !== cpassword){
             return res.render('signup',{
                 message: 'Passwords do not match!!'
             });
         }

        let hashedPassword = await bcrypt.hash(password,10);
        console.log(hashedPassword);


        // bcrypt.hash(password, 10, function(err, hash) {
        //     console.log(hash);
        // });
        
    });
}

你的注册函数不是异步的。试试这个:

exports.register = async (req,res) => {
    ...rest of the code
}

在异步函数中,您必须了解的基本知识是使函数异步然后使用 await,但是您的代码中没有异步函数会抛出错误。 因此,您必须将父函数设置为异步类型。更新了下面的代码

#previous code..
  db.query('SELECT * FROM users WHERE email=?', [email], async (error,result)=>{
    #other codes here..
    let hashedPassword = await bcrypt.hash(password,10);
    console.log(hashedPassword);
  });

#next code..

这样你就可以同时使用hash和salt