Mongoose实例.save()无效

时间:2016-03-01 21:14:34

标签: node.js mongodb mongoose

我遇到Mongoose和MongoDb的问题

非常有趣的是,只有Model.update有效且save永远不会起作用,甚至不会触发回调。

猫鼬:4.4.5 MongoDB:3.0.8

快速路线

var mongoose = require('mongoose');
mongoose.connect("mongodb://127.0.0.1:27017/db");
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function(callback) {
    console.log("connection to db open")
});
var User = require("../models/user.js");

用户模型

var user = new Schema({
    uid: { type: Number, required: true, unique: true},
    hwid: { type: String, default:""},
    bol:{type:String,default:""}
});

更新点数

  

工作版本: Model.update()

User.update({_id: id}, {
    uid: 5, 
}, function(err, numberAffected, rawResponse) {
    console.log(err);
})
  

不能正常工作,我必须解决这个问题: Object.save()

User.find({_id:id}, function(err,user){
    if(err){
         console.log(err);
    }
    if(!user){
         console.log("No user");
    }else{
        user.uid = 5;
        user.save(function(err,news){
            console.log("Tried to save...");
        });
    }
    console.log("At least worked");
})

即使回调也没有解雇。连接成功打开。它永远不会调用回调。

  1. 尝试使用var User = connection.model('User', schema)无效。

7 个答案:

答案 0 :(得分:19)

我不打算删除这个问题,因为人们也可能会遇到这个问题。实际上问题与MongoDb或Mongoose无关。致电Object.save()时,责任链如下:

  
      
  1. Schema.pre("保存&#34)
  2.   
  3. 将数据保存到dabe
  4.   
  5. Schema.post("保存&#34)
  6.   

因此,如果您屏蔽了pre("save")并且没有致电next()处理程序,那么您将无法保存您的文档。这是我的情况,我忘记了if语句中的next()调用,并试图找到错误超过3个小时。

user.pre("save", function(next) {
    if(!this.trial){
        //do your job here
        next();
    }
}

this.trial == true时,下一个处理程序无法访问。

为了防止这样的错误,我们应该负责分支机构的覆盖,记者可以向我们展示未经测试的代码。你的问题也可能与此有关。 如果您的文档已保存,请务必致电next()

修正版

user.pre("save", function(next) {
    if(!this.trial){
        //do your job here
    }
    next();
}

答案 1 :(得分:3)

这听起来很疯狂......我一直试图解决这个问题几个小时。看着这么多筹码溢出的帖子......令人难以置信。

你知道它是什么吗?我没有在网址的末尾指定数据库。

所以而不是

"mongodb://127.0.0.1:27017/test"

我有

"mongodb://127.0.0.1:27017

我浪费了一整天的时间。我真的希望我得到某种错误。保存记录总是返回确定。在数据库日志中,我连接好了。但我真的需要看看细节。是的,它是连接到mongo实例,而不是连接到数据库本身。啊!

答案 2 :(得分:2)

像保罗说的那样。很可能你是在'req.user'对象上调用save,它不是Mongoose对象。确保你做的是这样的事情:

{{1}}

答案 3 :(得分:1)

我有同样的问题。我的问题是关于更改db中的数组,然后当我尝试使用.save()时,它不了解我进行了任何更改,因此.save()无法正常工作。 我只是在使用.save()之前使用markModified(),但问题解决了。

这是我的问题代码:(不起作用)

club.members[index].name = new_name;
club.save();

这是我解决的代码:(有效)

club.members[index].name = new_name;
club.markModified('members');
club.save();

享受!

答案 4 :(得分:0)

以防万一发生这种情况。

另一个原因可能是您没有与mongodb实例的开放连接。检查输出以获得适当的连接反馈。

  

[initandlisten]连接从127.0.0.1:40448#1接受(1个连接现已打开)

答案 5 :(得分:0)

我遇到了同样的问题,结果发现instance.save()返回了一个承诺。因此,您要做的就是兑现承诺。 使用async/await-

await instance.save()

答案 6 :(得分:0)

对于任何与我有相同错误的人.. 如果在非常短的时间内两次调用.save()。最后一个电话将被丢弃。 我的问题是这个。

//module usersave(userData)
{
  await userData.save()
}
//module A
{...todos
  moduleB(userData)
  ...some todos that doesn't take much time.
  await usersave(userData) //second call
}
//module B(userData)
{
 ...todos;
 await usersave(userData) // first call
}

=> Object.save()在模块B处被调用,并立即在模块A处再次被调用。(与保存模块无关,也可以直接称为Object.save())。 这些调用堆栈不会发出错误,并且两个模块都将正常返回成功。但是,由于在mongodb实际反映更改之前引发了第二次调用,因此以后的调用将被丢弃。 问题是它返回时就像实际保存它们一样,因此您无法捕获错误。

解决方案:等待一会儿。等待新的Promise(r => setTimeout(r,2000))将执行。