mongoose示例方法显示不同的结果

sy5wg1nm  于 2022-11-13  发布在  Go
关注(0)|答案(3)|浏览(125)

我目前正在用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) }
    }
flseospp

flseospp1#

这不是一个专门针对 Mongoose 的问题,你需要重新理解承诺是如何起作用的。
在注解掉的代码中,在bcrypt.hash之前添加await应该可以使它工作,但是您没有理由在这里更喜欢.then而不是await
在第二个示例中,setPassword只触发哈希过程,并不要求调用者等待哈希完成,然后将哈希后的密码添加到文档中,而第一个示例则是这样做的。

ffvjumwh

ffvjumwh2#

您可以使用架构内置方法尝试此方法:

UserSchema.pre('save', async function (next) {
        if (this.isModified('hashedPassword')) {
            this.hashedPassword= await bcrypt.hash(this.hashedPassword, 10)
        }

        next()
    })
i2byvkas

i2byvkas3#

在模式中使用此预保存函数,如下所示:

UserSchema.pre('save', async function (next) {
  // Only if password was moddified
  if (!this.isModified('hashedPassword')) return next();
  // then Hash password
  this.hashedPassword = await bcrypt.hash(this.hashedPassword, 10);
  next();
});

相关问题