Mongoose实例.save()不起作用

Ahm*_*ven 18 mongoose mongodb node.js

我有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");
Run Code Online (Sandbox Code Playgroud)

用户模型

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

更新Enpoint

工作版本:Model.update()

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

不工作版本,我必须解决这个问题: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");
})
Run Code Online (Sandbox Code Playgroud)

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


  1. 试图使用var User = connection.model('User', schema)不起作用.

Ahm*_*ven 22

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

  1. Schema.pre( "拯救")
  2. 将数据保存到dabe
  3. Schema.post( "拯救")

因此,如果您阻止pre("save")并且不调用next()处理程序,则无法保存文档.这是我的情况,我next()在if语句中忘记了调用,并试图找到错误超过3个小时.

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

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

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

修正版

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

  • 我们可以在这里做到现实并注意,因为你的问题本身没有提到"预保存挂钩",所以这并不是任何人都会到达的解决方案.是的,如果没有调用中间件延续,那么代码就会被卡住而不能继续.这些实际上是"回调"而非承诺. (7认同)
  • 谢谢你拯救我的理智......这件事发生了同样的事情,我浪费了3个小时试图找出WTH正在发生...... (2认同)

Abo*_*ian 11

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

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

club.members[index].name = new_name;
club.save();
Run Code Online (Sandbox Code Playgroud)

这是我解决的代码:(工作)

club.members[index].name = new_name;
club.markModified('members');
club.save();
Run Code Online (Sandbox Code Playgroud)

请享用!

  • 我的问题类似,变化不够明确。不要试图像这样变得聪明:`document.keys = { ...document.keys, ...updates }` 而是一一应用所有更改 (2认同)

小智 5

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

//I am using your 'user' schema
var userModel = mongoose.model('User', user);
var User = mongoose.model('User');
var newUser = new User(req.user);
newUser.save(function(error, user){
   //your code
}
Run Code Online (Sandbox Code Playgroud)

  • 不,这不起作用,我确信 .save() 有问题 (3认同)

Sal*_*alx 5

这听起来很疯狂..并且我一直在努力解决这个问题几个小时。看着这么多堆栈溢出的帖子..令人难以置信。

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

所以代替

"mongodb://127.0.0.1:27017/test"
Run Code Online (Sandbox Code Playgroud)

我有

"mongodb://127.0.0.1:27017
Run Code Online (Sandbox Code Playgroud)

我为此浪费了一整天。我真希望我能得到某种错误。保存记录总是返回确定。并在数据库日志中,我连接正常。但是我确实需要查看细节。是的,它正在连接到mongo实例,但没有连接到数据库本身。啊!