Node.js Mongoose实例.save()不工作

Node.js Mongoose实例.save()不工作,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我对猫鼬和猫鼬有意见 非常有趣的是,只有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, 'connec

我对猫鼬和猫鼬有意见

非常有趣的是,只有
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:""}
});
更新Enpoint

工作版本:Model.update()

版本不工作,我必须解决这个问题:Object.save()

甚至连回调都没有触发。连接已成功打开。它从不调用回调


  • 尝试使用
    var User=connection。模型('User',schema)
    无效

  • 就像保罗说的。很可能您正在对“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
    }
    

    我不打算删除这个问题,因为人们可能也会遇到这个问题。事实上,这个问题和猫鼬或猫鼬无关。调用
    Object.save()
    时,责任链如下:

  • Schema.pre(“保存”)
  • 将数据保存到dabe
  • 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();
    }
    
    以防万一这发生在其他人身上

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

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


    这听起来很疯狂。。我已经努力解决这个问题好几个小时了。看了这么多的堆栈溢出帖子。。难以置信

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

    所以不是

    "mongodb://127.0.0.1:27017/test"
    
    我有


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

    我遇到了同样的问题,结果是
    instance.save()
    返回了一个承诺。所以你需要做的就是履行诺言。 使用
    async/await
    -

    await instance.save()
    

    我也有同样的问题。我的问题是在db中更改数组,然后当我尝试使用.save()时,它不知道我更改了什么,然后.save()就不起作用了。 我只是在使用.save()之前使用markModified(),我的问题就解决了

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

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


    享受吧

    对于任何和我有相同错误的人。。 如果在很短的时间内调用.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中再次被调用(无论您是创建save模块还是直接调用Object.save())。 这些类型的调用堆栈不会发出错误,并且在两个模块上都会返回正常的成功。然而,由于第二个调用是在mongodb实际反映更改之前调用的,所以后面的调用被丢弃。 问题是,它返回的结果就像它们实际上被保存了一样,所以您无法捕获错误


    解决方案:只需等待。等待新的承诺(r=>setTimeout(r,2000))就可以了

    我知道你的评论说它是一个mongo对象,但老实说,你所展示的东西中没有任何东西可以证明这一点,这很可能是你的
    .save
    方法没有触发的原因。您如何验证它是否是从DB返回的实际实例?@Paul为您更新了问题当您在
    .find()
    回调中console.log
    user
    时会发生什么?@JesseKernaghan没事,它没有调用回调。@JesseKernaghan,@Paul感谢您的帮助,我自己解决了这个问题。犯了一个新的错误。不,这不起作用,我确信.save()有问题。我们可以现实一点,注意,由于您的问题本身没有提到“预保存挂钩”,所以这并不是任何人都会想到的解决方案。是的,当然,如果没有调用中间件延续,那么代码就会被卡住而无法继续。这些实际上是“回电”而不是承诺。谢谢你救了我的理智。。。同样的事情发生了,我花了3个小时试图弄清楚到底发生了什么……我的问题也很相似,变化不够明确。不要试图像这样变得聪明:
    document.keys={…document.keys,…updates}
    而是逐个应用所有更改哇,这非常有用!我使用了一个mutator函数来修改数组的内容,而Mongoose并没有提取它们。这个答案结束了长达数小时的错误搜寻。只是一个旁注,如果你有像我这样复杂的更新,它也适用于列表(:还修复了我在更新地图中某些嵌套属性时遇到的问题这对我来说也很有效,谢谢!耶稣谢谢你..在这个问题上坚持了20分钟哦,你在2020年救了我的命:D谢谢,我也犯了同样的错误,忘了添加数据库名。在我的情况下,问题是,我就这样离开了。我是多么愚蠢。哈哈
    "mongodb://127.0.0.1:27017
    
    await instance.save()
    
    club.members[index].name = new_name;
    club.save();
    
    club.members[index].name = new_name;
    club.markModified('members');
    club.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
    }