mongodb Mongoose instance .保存()不工作

wh6knrhe  于 2023-03-29  发布在  Go
关注(0)|答案(8)|浏览(190)

我对Mongoose和MongoDb有问题
非常有趣的是,只有Model.update工作,save从不工作,甚至不触发回调。
Mongoose: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.保存()

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)不工作。

daupos2t

daupos2t1#

我有同样的问题。我的问题是关于改变一个数据库内的数组,然后当我尝试使用.保存(),它不理解我改变了任何东西,然后.save()不工作。我只是使用markModified()之前使用.save()和我的问题得到解决。
这是我的问题代码:(不工作)

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

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

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

好好享受吧!

pvabu6sv

pvabu6sv2#

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

  1. schema.pre(“保存”)
    1.将数据保存到dabe
  2. Schema.post (“保存”)
    所以如果你阻塞了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();
}
w46czmvw

w46czmvw3#

这听起来很疯狂..我已经试着解决这个问题几个小时了。看了这么多堆栈溢出的帖子..真是难以置信。
你知道这是什么吗?我没有在URL的末尾指定数据库。
所以与其说

"mongodb://127.0.0.1:27017/test"

我有

"mongodb://127.0.0.1:27017

我在这上面浪费了一整天。我真希望我得到了某种错误。保存记录总是返回ok。在数据库日志中,我连接ok。但我真的需要看看细节。是的,它连接到mongo示例,但不是连接到数据库本身。唉!

zysjyyx4

zysjyyx44#

就像Paul说的。很可能你正在调用'req.user'对象上的保存,它不是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
}
mw3dktmi

mw3dktmi5#

  • 以防这事发生在别人身上 *

另一个原因可能是你没有打开到mongodb示例的连接。检查你的输出以获得适当的连接反馈。
[initandlisten]从127.0.0.1接受连接:40448 #1(1个连接现在打开)

cl25kdpy

cl25kdpy6#

我遇到了同样的问题,原来instance.save()返回一个promise。所以你需要做的就是处理这个promise。使用async/await-

await instance.save()
oxf4rvwz

oxf4rvwz7#

modlename.save()不再接受回调,现在您可以使用Promises解决此问题

newData.save().then(function(err) {
  if (!err) {
    res.send("Successfully Added to th DataBase.");
  } else {
    res.send(err);
  }
});
ymzxtsji

ymzxtsji8#

如果你在很短的时间内调用.保存()两次,最后一次调用将被丢弃。我的问题是这样的。

//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实际反映变化之前被调用,later调用只是被丢弃。问题是它返回的时候就好像它们实际上被保存了一样,所以你不能捕捉到错误。
解决方案:只要输入一个await. await new Promise(r=〉setTimeout(r,2000))就可以了。

相关问题