我目前正在用javascript、koa和mongoose制作一个服务器。我制作了两个不同的mongoose示例方法,它们从JSON主体接收密码,并用bcrypt对其进行哈希处理,并将其保存在用户的“hashedPassword”中。
最初,我编写了第二个setPassword函数(它使用promise、'then'方法。),但是当保存用户文档时,'hashedPassword'属性没有出现。
所以我尝试了第一个,它工作得很好,用户文档已经用hashedPassword保存。
虽然这两个示例方法看起来很相似,但我想知道为什么这些方法会导致不同的结果。请帮助
import mongoose from "mongoose";
import bcrypt from "bcrypt";
const UserSchema = mongoose.Schema({
username: String,
hashedPassword: String,
});
UserSchema.methods.setPassword = async function (password) {
const hash = await bcrypt.hash(password, 10);
this.hashedPassword = hash;
};
// UserSchema.methods.setPassword = async function (password) {
// bcrypt.hash(password, 10).then((hash) => {
// this.hashedPassword = hash;
// });
// };
// this code didn't save the hashed
const User = mongoose.model("user", UserSchema);
export default User;
用户控制器应该是这样的
const register = async (ctx) => {
const { username, password } = ctx.request.body;
try {
const user = new User({
username,
});
await user.setPassword(password);
await user.save();
catch(e) { ctx.throw(500,e) }
}
3条答案
按热度按时间flseospp1#
这不是一个专门针对 Mongoose 的问题,你需要重新理解承诺是如何起作用的。
在注解掉的代码中,在
bcrypt.hash
之前添加await
应该可以使它工作,但是您没有理由在这里更喜欢.then
而不是await
。在第二个示例中,
setPassword
只触发哈希过程,并不要求调用者等待哈希完成,然后将哈希后的密码添加到文档中,而第一个示例则是这样做的。ffvjumwh2#
您可以使用架构内置方法尝试此方法:
i2byvkas3#
在模式中使用此预保存函数,如下所示: