【问题标题】:Mongoose not saving data with no error猫鼬没有正确保存数据
【发布时间】:2020-09-16 04:12:02
【问题描述】:

我有这个代码

      User.findOne({ email: req.body.email }, function(err, user) {
        if (user) {
          return res.status(400).json([{ msg: 'The email address you have entered is already associated with another account.' }]);
        }
        user = new User({
          name: req.body.name,
          email: req.body.email,
          password: req.body.password,
          mobile: req.body.mobile
        });
        user.save(function(err) {
          res.json({ token: generateToken(user), user: user });
        });
      });

我尝试使用邮递员发送请求,但我确实收到了用户对象的响应,这意味着保存功能中没有错误

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJleGNlcHRpb25zLnNnIiwic3ViIjoiNTc5NWQ0NzQxYmEzZWQwODE1ZTgzY2NmIiwiaWF0IjoxNDY5NDM3MDQ0LCJleHAiOjE0NzAwNDE4NDR9.2otkcPkJgsXvR8QOHAojDJ5YCxR7Uc2E4ApS77T55F8",
  "user": {
    "__v": 0,
    "created_at": "2016-07-25T08:57:24.612Z",
    "updated_at": "2016-07-25T08:57:24.612Z",
    "name": "Test",
    "email": "Test@hotmail.com",
    "password": "$2a$10$3UmABiDPeo6iHZ.DFbwOO.1ANpUWQmwr86bYbTmRuFedsbDcE0bbC",
    "mobile": 12345,
    "_id": "5795d4741ba3ed0815e83ccf"
  }
}

但是我的数据库中没有这个条目。我用 Robomongo 检查了我的数据库,我确定没有数据。我错过了什么?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    这与 OP 的具体情况无关,但对于其他在修改对象的 Mixed 属性后尝试保存未成功的人,您必须调用 markModified(path) 让 Mongoose 知道该属性已更改。

    person.anything = { x: [3, 4, { y: "changed" }] }; // anything is 'Mixed' in the schema
    person.markModified('anything');
    person.save(); // anything will now get saved
    

    查看Mongoose docs here 的“混合”部分

    【讨论】:

    • 这解决了我的问题,save() 没有持续存在。
    • 这是我需要的。我的 save() 返回一个包含我所做更改的对象,但永远不会持续存在。 markModfied() 解决了我的问题。
    • 这也解决了我的问题。我使用的是嵌套的Maps,而不是Mixed。我什至检查了isModified,它正在返回true,而save 没有给出任何错误,但它仍然不会持续存在。使用markModified 是让它工作的唯一方法。
    【解决方案2】:

    您在保存集合时处理错误,请将您的 user.save 函数替换为

    user.save(function(err){
          if(err){
               console.log(err);
               return;
          }
    
          res.json({ token: generateToken(user), user: user });
    });
    

    这样,您将能够跟踪数据是否已保存以及相关的错误可能是什么。

    【讨论】:

    • 谢谢。我有一个用户名字段重复键错误,该错误在模式中不存在。删除了集合,它又可以工作了。没有意识到我没有发现错误。
    【解决方案3】:

    我知道这听起来很愚蠢,但是 Mongoose 使用复数形式的集合名称,所以

    mongoose.model('User' ...
    

    保存到用户收藏。在我刷新 mongoDB 客户端并意识到我的所有文档都在“用户”而不是“用户”之前,我浪费了几个小时。

    【讨论】:

    • 哇,它们在引擎盖下也是复数形式。 “人”->“人”。这个库我遇到了很多问题,我永远不会在付费之外使用它。
    【解决方案4】:

    对于遇到此问题的其他人,您模型的 _id SchemaType 必须是 ObjectId 类型。

    假设我们有一个模式和模型定义为:

    var userSchema = new mongoose.Schema({
      _id: mongoose.Schema.ObjectId,
      userID: Number,
      name: String
    });
    
    var Users = mongoose.model('collectionName', userSchema);
    

    我们想用userID 1234 更新用户名:

    Users.findOne({userID: 1234}, function(err, user) {
        user.name = "Jane Doe";
    
        user.save(function(err) {
           // ...
        }
    }
    

    Mongoose 将通过执行以下操作成功更新它:

    users.update({ _id: ObjectId("anObjectID") }, { '$set': { name: 'Jane Doe' } })
    

    如果我们在userSchema 中将_id 的SchemaType 设置为String,它会这样做:

    users.update({ _id: 'anObjectID' }, { '$set': { name: 'Jane Doe' } })
    

    【讨论】:

      【解决方案5】:

      我认为这很可能试试这个,更改用户对象的变量名

      User.findOne({ email: req.body.email }, function(err, user) {
              if (user) {
                return res.status(400).json([{ msg: 'The email address you have entered is already associated with another account.' }]);
              }
              newUser = new User({
                name: req.body.name,
                email: req.body.email,
                password: req.body.password,
                mobile: req.body.mobile
              });
              newUser.save(function(err,saveUser) {
                res.json({ token: generateToken(saveUser), user: saveUser });
              });
            });
      

      【讨论】:

        【解决方案6】:

        使用错误函数帮助了我!

         await user.save(function(err){
          if(err){
               console.log(err);
               return;
          }});
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-26
          • 1970-01-01
          • 2013-12-16
          相关资源
          最近更新 更多