Mongoose.js instance.save()回调没有触发

时间:2012-04-14 19:24:06

标签: mongodb mongoose

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')
}});

终端不会打印“错误”或“无错误”。什么是连接。在'错误'似乎也没有触发。我已经确认MongoDb正在运行。

3 个答案:

答案 0 :(得分:67)

这种情况是您将模型添加到全局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);

答案 1 :(得分:0)

发布的答案无法解决问题。不幸的是,我不能只升级我的数据库,所以这对我来说也不是解决方案。但在这里我找到了解决这个问题的方法: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'
}});

答案 2 :(得分:0)

我真的很喜欢亚伦的回答,而且由于他,我现在正在解决这个问题上……尽管我还没有!这是我的特别问题:

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

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);
    }
  });
});

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

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

当我运行该程序时,控制台中显示“ Here 1”,但没有显示“ Here 2”或“ Here 3”。

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

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

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

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

var itemSchema = require('../w8/W8DBItemSchema.js'); 
...

var W8DBItem = db.model('W8DBItem', itemSchema);
var newWeightItem = W8DBItem(aWeight);
...

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

rotate: true

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