本意是先判断
- 邮箱有没注册
- 再加密密码
- 再存储到数据库
代码
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;
}
})