草庐IT

javascript - Mongoose 没有将更新的文档保存到数据库

coder 2023-10-30 原文

编辑:这个问题之前有人问过,但我没问好。我已经重写了这个问题。预先感谢您的帮助!

我正在为一个学校项目编写一个简单的消息传递服务器。在其其他功能中,服务器允许用户更新存储在其帐户中的信息。当用户确实更新他们的帐户时,会为他们生成一个身份验证 token 。这是定义所有这些的模式。注意,headerbody 是用户输入的一部分:

UserSchema = new Schema({
  _id: {type: ObjectId, select: false},
  username: {type: String, required: true, index: {unique: true} },
  password: {type: String, required: true, select: false},
  email: {type: String},
  token: {type: String, select: false}
}, {
  autoIndex: false 
});
UserSchema.pre("save", function(next) {
  // Create a new token for the user
  var self = this;

  bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
    if (err) {
      next(err);
    } else {
      crypto.randomBytes(256, function(err, bytes) {
        if (err) {
          next(err);
        } else {
          bytes = bytes.toString("hex");
          bcrypt.hash((new Date() + bytes), salt, function(err, tokenHash) {
            if (err) {
              next(err);
            } else {
              self.token = tokenHash;
              next();
            }
          });
        }
      });
    }
  });
});
UserSchema.pre("save", function(next) {
  // Hash the password before saving
  var self = this;
  if (!self.isModified("password")) {
    next();
  } else {
    bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
      if (err) {
        next(err);
      } else {      
        bcrypt.hash(self.password, salt, function(err, passwordHash) {
          if (err) {
            next(err);
          } else {
            self.password = passwordHash;
            next();
          }
        });
      }
    });
  }
});

我在更新特定用户时遇到问题。因为我想使用模型中间件,所以我更新用户的方式是使用 Model#findOne(),然后使用 Model#save()。这是我必须执行的代码:

// Make sure user provided all necessary information.
if (!header.token) {
  return callback(new errors.MissingHeaderDataError("Missing 'token' parameter in the header."));
} else {
  // Update the user account based on what's in the envelope's body.
  User.findOne({"token": header.token}, "+token +password", function (err, user) {
    if (err) {
      return callback(err);
    } else {
      // Get a list of all parameters the user wants to change.
     var paramsToChange = Object.keys(body);

     // Now update the parameters
      paramsToChange.forEach(function(param) {
        user[param] = body[param];
     });
      console.log("Updated user:");
      console.dir(user);
      user.save(function(err, user) {
        if (err) {
          return callback(err);
        } else {
          console.log("Returned user:");
          console.dir(user);
          User.find({}, "+token +password", function(err, foundUser) {
            if (err) {
              throw err;
            } else {
              console.log(JSON.stringify(foundUser));
            }
          });
          callback(null, new SuccessEnvelope(user));
        }
      });
    }
  });
}

当我运行测试并到达代码的最后一位时(返回 save() 之后),我得到以下输出:

Updated user:
{ token: '$2a$10$5VWWqjJ52aGbS4xc6NDKjuGPv8brX7pRmwiKyYjP8VHoTKCtYZiTu',
  username: 'jim_bob',
  password: '$2a$10$ue08HUsunzzzcbZURzXF7uaH1dZxF3SwkwadC6D1JsIC9xAUhTbCC',
  email: 'joe_bob@email.com',
  __v: 0 }
Returned user:
{ token: '$2a$10$fRwED..7fFFhN46Vn.ZJW..xYql5t5P39LHddjFS4kl/pmhwfT.tO',
  username: 'jim_bob',
  password: '$2a$10$ue08HUsunzzzcbZURzXF7uaH1dZxF3SwkwadC6D1JsIC9xAUhTbCC',
  email: 'joe_bob@email.com',
  __v: 0 }
[{"token":"$2a$10$5VWWqjJ52aGbS4xc6NDKjuGPv8brX7pRmwiKyYjP8VHoTKCtYZiTu","username":"joe_bob","password":"$2a$10$ue08HUsunzzzcbZURzXF7uaH1dZ
xF3SwkwadC6D1JsIC9xAUhTbCC","email":"joe_bob@email.com","__v":0}]

如您所见,文档没有正确保存到数据库中,因为之前的数据仍然存在。我的问题是:为什么? 为什么调用保存时用户没有更新?我认为我做的一切都是正确的,但显然我不是。任何帮助都会很棒,因为我快要疯了!

最佳答案

显然,为了将文档保存到数据库中,它需要一个_id。有点傻,Mongoose 在找不到文档时不会给出错误。唉……

我更新了我的代码以反射(reflect)更改:

 // Make sure user provided all necessary information.
  if (!header.token) {
    return callback(new errors.MissingHeaderDataError("Missing 'token' parameter in the header."));
  } else {
    // Update the user account based on what's in the envelope's body.
    User.findOne({"token": header.token}, "+_id +token +password", function (err, user) {
      if (err) {
        return callback(err);
      } else {
        console.log("Found user:");
        console.dir(user);
        // Get a list of all parameters the user wants to change.
        var paramsToChange = Object.keys(body);

        // Now update the parameters
        paramsToChange.forEach(function(param) {
          user[param] = body[param];
        });
        console.log("Updated user:");
        console.dir(user);
        user.save(function(err, user, numberTouched) {
          if (err) {
            return callback(err);
          } else {
            console.log("Returned user:");
            console.dir(user);
            console.log(numberTouched);
            User.find({}, "+token +password", function(err, foundUser) {
              if (err) {
                throw err;
              } else {
                console.dir(foundUser);
              }
            });
            callback(null, new SuccessEnvelope(user));
          }
        });
      }
    });
  }

关于javascript - Mongoose 没有将更新的文档保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19188595/

有关javascript - Mongoose 没有将更新的文档保存到数据库的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  4. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  5. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  6. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  9. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  10. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

随机推荐