25
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 正在运行。

4

3 回答 3

69

这是您将模型添加到全局猫鼬对象但打开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);
于 2012-04-18T00:13:44.710 回答
1

我真的很喜欢 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);
...

奇迹般有效。我希望这可以帮助别人!

于 2018-11-27T17:43:05.740 回答
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'
}});
于 2017-06-07T23:37:23.367 回答