javascript - 保存 Mongo 文档时出现异常

标签 javascript express mongoose passport.js mean-stack

在平均堆栈应用程序中,我在用户架构中创建一个新用户,然后在文档架构中创建一个新文档

    var UserSchema = new Schema({
            username: String,
            password: String,
            docs: [{
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Doc'
            }],
        )
    }

    var DocSchema = new Schema({…)
    }

    UserSchema.pre('save', function(next) {
        if (this.password) {
            this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
            this.password = this.hashPassword(this.password);
        }
        next();
    });

以下代码部分是 Passport 注册,最后我遇到了 newUser.save() 的问题;在推送方法之后,如果我不保存用户,则文档 ID 不会显示在用户文档中。但保存用户似乎也更改了哈希密码。如果我评论 newUser.save();登录工作正常,否则我会得到错误的密码

    passport.use('local-signup', new LocalStrategy({
              usernameField: 'username',
              passwordField: 'password',
              passReqToCallback: true
      },
      function(req, username, password, done) {

          process.nextTick(function() {

                  User.findOne({
                          username: username
                      }, function(err, user) {
                          // if there are any errors, return the error
                          if (err)
                              return done(err);
                          if (user) {
                              return done(null, false, req.flash('signupMessage', 'Username is already taken.'));
                          } else {
                              var newUser = new User();
                              newUser.username = username;
                              newUser.password = password;
                              newUser.email = req.body.email;
                              newUser.save(function(err) {
                                  if (err)
                                      throw err;
                                  var doc = new Doc({
                                      user: newUser.username,
                                      docTitle: newUser.username
                                  });
                                  doc.save(function(err) { // create doc
                                      if (err) {
                                          return next(err);
                                      } else {
                                          newUser.docs.push(doc); // push doc'id in docs field in user
                                          newUser.save(); // save user after doc'id has been push
                                      };
                                      return done(null, newUser);
                                  });
                              });

如有任何帮助,我们将不胜感激

最佳答案

您的 Mongoose 预保存中间件中的逻辑是“如果正在保存的文档有密码,则生成盐并对密码进行哈希处理”。因此,如果已加盐和散列的文档中存在密码,则当中间件运行时,它将再次对这个预先存在的密码进行加盐和散列。这就是为什么你无法再次登录的原因;每次保存文档时您的密码都会更改。

我猜您希望 mongoose 预保存中间件仅在您第一次保存文档时运行。每次保存文档时都会运行预保存中间件。您可以使用预保存中间件中的文档上的 this.isNew 属性。这将确保仅在您第一次保存文档时生成密码。

UserSchema.pre('save',  function(next) {
    if (this.password && this.isNew) {
        this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
        this.password = this.hashPassword(this.password);
    }
    next();
});

关于javascript - 保存 Mongo 文档时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685986/

相关文章:

javascript - TypeError : populate(. ..).exec 不是函数

node.js - NodeJS API : Find a document into a collection by "Id" property , 在 Mongodb 中默认不是 "_id"

javascript - JS 如何在 forEach 循环中从数组中删除一个对象?

javascript - JavaScript 中的基本数学函数可在 HTML 页面上显示

javascript - 使用 iScroll 时防止弹出窗口滚动

javascript - 循环遍历 Express 应用程序中未显示的虚拟数据

javascript - 刷新页面后 Div 保存其颜色?

javascript - 两个提交按钮 - Node js Express

node.js - 如何将 Angular(前端)和 Node.js(服务器)应用程序打包在一起

node.js - Mongodb 仅当匹配的组合不返回 true 时才查找和 insertMany