本意是先判断

  1. 邮箱有没注册
  2. 再加密密码
  3. 再存储到数据库

代码

router.post("/register", async ctx => {

  const findResult = await User.find({ email: ctx.request.body.email })

  if (findResult.length > 0) {
    ctx.status = 500;
    ctx.body = { email: '邮箱已经被注册' }
  } else {
    const newUser = new User({
      name: ctx.request.body.name,
      email: ctx.request.body.email,
      password: ctx.request.body.password,
    });


    await bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(newUser.password, salt, (err, hash) => {
        if (err) throw err
        newUser.password = hash
      });
    });


    //存储到数据库
    await newUser.save()
      .then(user => {
        console.log(user, '===')
        ctx.body = user;
      })
      .catch((err) => {
        console.log(err)
      });

    ctx.body = newUser;
  }

})

但bcrypt.genSalt这个await好像没起作用,后边的在这个await函数前边执行了

修改一下代码打印一下await的返回值,是undefined

   let aaa = await bcrypt.genSalt(10, (err, salt) => {
      bcrypt.hash(newUser.password, salt, (err, hash) => {
        if (err) throw err
        newUser.password = hash
        console.log('密码加密')
      });
    });

    console.log(aaa, 'bcrypt awaitttttttt')

参考 https://segmentfault.com/q/1010000016442620
总结:await后边需要返回一个promise 要不不起作用…,因为如果await后边不是一个promise,会自动转换为一个resolve的promise,所以要promise封装起来异步完成后resolve

修改代码把 bcrypt.genSalt 封装成一个promise

router.post("/register", async ctx => {

  const findResult = await User.find({ email: ctx.request.body.email })

  if (findResult.length > 0) {
    ctx.status = 500;
    ctx.body = { email: '邮箱已经被注册' }
  } else {
    const newUser = new User({
      name: ctx.request.body.name,
      email: ctx.request.body.email,
      password: ctx.request.body.password,
    });


    await new Promise(function (resolve, reject) {
      bcrypt.genSalt(10, (err, salt) => {
        bcrypt.hash(newUser.password, salt, (err, hash) => {
          if (err) {
            reject(err)
          }
          newUser.password = hash
          resolve(newUser.password)
        });
      });
    });


    //存储到数据库
    await newUser.save()
      .then(user => {
        console.log(user, '===')
        ctx.body = user;
      })
      .catch((err) => {
        console.log(err)
      });

    ctx.body = newUser;
  }

})

OK