Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongoose.js instance.save()回调未触发_Mongodb_Mongoose - Fatal编程技术网

Mongodb Mongoose.js instance.save()回调未触发

Mongodb Mongoose.js instance.save()回调未触发,mongodb,mongoose,Mongodb,Mongoose,“错误”或“无错误”都不会打印到终端。此外,“error”上的connection.on似乎也没有启动。我已确认MongoDb正在运行。这种情况下,您将模型添加到全局mongoose对象,但打开一个单独的连接mongo.createConnection(),该连接不是模型的一部分。由于模型没有连接,因此无法保存到数据库 这可以通过在全局mongoose连接上连接mongo来解决: var mongo = require('mongoose'); var connection = mongo.cr

“错误”或“无错误”都不会打印到终端。此外,“error”上的connection.on似乎也没有启动。我已确认MongoDb正在运行。

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

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

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')
}});
var connection = mongo.createConnection('mongodb://127.0.0.1/test');
// becomes
var connection = mongo.connect('mongodb://127.0.0.1/test');
或者通过将模型添加到单独的连接:

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')
}});
var connection = mongo.createConnection('mongodb://127.0.0.1/test');
// becomes
var connection = mongo.connect('mongodb://127.0.0.1/test');

贴出的答案并不能解决问题。不幸的是,我不能仅仅升级我的数据库,所以这对我来说也不是一个解决方案。但我在这里找到了解决这个问题的办法:

只需使用
$\u save
而不是
。保存
如图所示:

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

我真的很喜欢亚伦的回答,多亏了他,我现在正在解决这个问题的路上。。。虽然我还没到那里!以下是我的特别问题:

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

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'
}});
在我的程序文件中,我执行以下操作:

var mongoose = require('mongoose');
var itemSchema = new mongoose.Schema({ name: {type: String, required: true}});
module.exports = mongoose.model('W8DBItem', itemSchema);
当我运行这个程序时,我在控制台中得到“here1”,但从来没有得到“here2”或“here3”

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

非常感谢您的想法和建议

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

我不是从对象文件导出mongoose.model,而是只导出架构:

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;

工作起来很有魅力。我希望这对别人有帮助

谢谢,向mongoosejs.com的教程提交了一个修复程序。@aaronheckmann,当将
mongo.model
更改为
connection.model
时,我得到
TypeError:path.login中未定义的类型您尝试嵌套架构了吗?您只能使用引用或数组进行嵌套。
;从3.8升级到4.2对我来说很有效(有了MongoDB 3.0.4),这个答案节省了我很多时间,非常感谢。当我在使用mongoose.createConnection时执行model.save()时,我的lambda函数会超时,我意识到存在问题,正在执行连接。model.save()修复了我的问题,我不想导出架构,但模型。根据可能的情况,因为Mongoose应该缓冲.model()调用,直到建立连接。不幸的是,这不起作用(