【问题标题】:Mongoose.js instance.save() callback not firingMongoose.js instance.save() 回调未触发
【发布时间】:2012-04-26 17:59:45
【问题描述】:
var mongo = require('mongoose');
var connection = mongo.createConnection('mongodb://127.0.0.1/test');

connection.on("error", function(errorObject){
  console.log(errorObject); 
  console.log('ONERROR');
});

var Schema = mongo.Schema;
var BookSchema = new Schema({ title : {type : String, index : {unique : true}}});
var BookModel = mongo.model('abook', BookSchema);
var b = new BookModel({title : 'aaaaaa'});

b.save( function(e){ 
  if(e){
    console.log('error')
  }else{
    console.log('no error')
}});

“错误”或“无错误”都不会打印到终端。更重要的是,connection.on 'error' 似乎也没有触发。我已经确认 MongoDb 正在运行。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    在这种情况下,您将模型添加到全局 mongoose 对象,但打开了一个单独的连接 mongo.createConnection(),模型不属于该连接。由于模型没有连接,因此无法保存到数据库。

    这可以通过在全局 mongoose 连接上连接到 mongo 来解决:

    var connection = mongo.createConnection('mongodb://127.0.0.1/test');
    // becomes
    var connection = mongo.connect('mongodb://127.0.0.1/test');
    

    或通过将模型添加到单独的连接:

    var BookModel = mongo.model('abook', BookSchema);
    // becomes
    var BookModel = connection.model('abook', BookSchema);
    

    【讨论】:

    • 谢谢,提交了对 mongoosejs.com 教程的修复。
    • @aaronheckmann,将mongo.model 更改为connection.model 我得到TypeError: Undefined type at 'paths.login' Did you try nesting Schemas? You can only nest using refs or arrays.
    • 这个答案不起作用:更新猫鼬;从 3.8 升级到 4.2 对我有用(使用 MongoDB 3.0.4)
    • 这个答案为我节省了很多时间,非常感谢。当我在使用 mongoose.createConnection 时执行 model.save() 时,我的 lambda 函数会超时,我意识到存在问题并执行 connection.model.save() 修复它
    【解决方案2】:

    我真的很喜欢 Aaron 的回答,多亏了他,我现在正在解决问题的路上......虽然我还没有到那里!这是我的特殊问题:

    我想在单独的文件中定义我的架构和模型,这样我就可以在项目之间重复使用它们。例如,我有一个名为 W8DBItem.js 的文件,如下所示:

    var mongoose = require('mongoose');
    var itemSchema = new mongoose.Schema({ name: {type: String, required: true}});
    module.exports = mongoose.model('W8DBItem', itemSchema);
    

    在我的程序文件中,我这样做:

    var mongoose = require('mongoose');
    var W8DBItem = require('../w8/W8DBItem.js'); 
    var dbURL ='mongodb://localhost:27017/default';
    var mongoOptions = { useNewUrlParser: true, bufferCommands: false }
    mongoose.connect(dbURL, mongoOptions);
    
    var db = mongoose.connection;
    
    // DEAL WITH CONNECTION ERROR
    db.on('error', console.error.bind(console, 'connection error:'));
    
    // PREP DATA
    var aWeight = { name: "My Test Name" };
    var newWeightItem = W8DBItem(aWeight);
    
    // CONNECTION ESTABLISHED
    db.once('open', function() {
        console.log("Here 1")
    
        // TRY TO SAVE
       newWeightItem.save(function (err, newWeightItem) {
        if (err) { 
            console.log("Here 2");
            console.log(err);
        }
        else {
            console.log("Here 3");
            console.log(newWeightItem);
        }
      });
    });
    

    当我运行这个程序时,我在控制台中得到“Here 1”,但从来没有“Here 2”或“Here 3”。

    从 Aaron 的帖子中,我了解到 W8DBItem 对象没有关联(和打开的)连接,但我不确定如何解决问题。我可以在 W8DBItem.js 文件中连接到数据库,但我真的不喜欢用对象硬编码服务器信息 - 我希望这些对象在不同的​​文件中使用,也许使用不同的服务器。

    非常感谢您的想法和建议!

    [编辑:找到解决方案!!!]

    我没有从我的目标文件中导出我的 mongoose.model,而是仅导出架构:

    var mongoose = require('mongoose');
    var itemSchema = new mongoose.Schema({name: {type: String, required: true}});
    module.exports = itemSchema;
    

    然后在我的程序文件中执行以下操作:

    var itemSchema = require('../w8/W8DBItemSchema.js'); 
    ...
    
    var W8DBItem = db.model('W8DBItem', itemSchema);
    var newWeightItem = W8DBItem(aWeight);
    ...
    

    像魅力一样工作。我希望这对某人有帮助!

    【讨论】:

    • 有同样的问题,我不想导出架构,而是导出模型。根据mongoosejs.com/docs/connections.html,这是可能的,因为 Mongoose 应该 缓冲 .model() 调用,直到建立连接。不幸的是不起作用。 :(
    【解决方案3】:

    发布的答案不能解决问题。不幸的是,我不能只升级我的数据库,所以这对我来说也不是一个解决方案。但是在这里我找到了解决这个问题的方法:https://github.com/Automattic/mongoose/issues/4064

    如图所示,只需使用.$__save 而不是.save

    var b = new BookModel({title : 'aaaaaa'});
    
    b.$__save({}, function(e){ 
      if(e){
        console.log('error')
        // callback will show if e exists
      }else{
        console.log('no error')
        // callback will show 'no error'
    }});
    

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      相关资源
      最近更新 更多