2016-03-16 49 views
1

我正在尝试使用Node.js将数据写入MongoDB 写入数据时,在最后一行出现以下错误。 运行日志:mongodb在保存数据时抛出错误(拓扑被破坏)

{ _id: 56e90c1292e69900190954f5, 
nfs: [ 'ebdp1', 'ebdp2', 'ebdp3', 'ebdp4' ], 
snapShotTime: '2016-03-16 07:32:34' } 
{ [MongoError: topology was destroyed] name: 'MongoError', message: 'topology was destroyed' } 

我的代码结构是根据框架,其中收藏的架构是appTableProdSchema.js文件,并在文件appTableProdData.js对象数据。 主要就是newMain.js

代码如下: newMain.js

var mongoose = require('mongoose'); 
var moment = require('moment'); 
var nfs_check=""; 
var promises = []; 

var nodes = ["ebdp1","ebdp2", "ebdp3", "ebdp4"]; 

mongoose.connect('mongodb://localhost:27017/test'); 
var db = mongoose.connection; 
var storageData = require('./appTableProdData.js'); 
var storageDataSchema = require('./appTableProdSchema.js'); 
var obj = {}; 
obj.snapShotTime = moment().utc().format("YYYY-MM-DD HH:mm:ss"); 
obj.nfs = nodes; 
db.once('open', function() { 
    var mongoData = new storageData(); 
    mongoData.fill(obj); 
    var promise = new storageDataSchema(mongoData.getInformation()); 
    console.log(promise.toString()); 
    promise.save(function (err, promise) { 
      if (err) return console.error(err); 
      promise.speak(); 
     }); 
}); 
mongoose.disconnect(); 

appTableProdSchema.js

var mongoose = require('mongoose'); 

module.exports = mongoose.model('AppTableProd', { 
    snapShotTime : String, 
    nfs: Array  
}); 

appTableProdData.js

var storageData = function() { 
    this.data = { 
      snapShotTime: null, 
      nfs: null  
    }; 
    this.fill = function(resp) { 
     this.data.snapShotTime = resp.snapShotTime; 
     this.data.nfs = resp.nfs; 
    }; 
    this.getInformation = function() { 
     return this.data; 
    }; 
}; 
module.exports = storageData; 

知道为什么我变得topology destroyed错误? 请帮忙。

回答

5

mongoose.disconnect(); 

获取调用之前得到执行

db.once('open', function() { 
var mongoData = new storageData(); 
mongoData.fill(obj); 
var promise = new storageDataSchema(mongoData.getInformation()); 
console.log(promise.toString()); 
promise.save(function (err, promise) { 
     if (err) return console.error(err); 
     promise.speak(); 
    }); 
}); 

这个代码块,因为它是一个异步调用。

你应该把这个

mongoose.disconnect(); 

这样

db.once('open', function() { 
var mongoData = new storageData(); 
mongoData.fill(obj); 
var promise = new storageDataSchema(mongoData.getInformation()); 
console.log(promise.toString()); 
promise.save(function (err, promise) { 
     if (err) return console.error(err); 
     promise.speak(); 
     mongoose.disconnect(); 
    }); 
}); 
+0

上面提供的感谢穆斯塔法...这工作:D非常感谢 – aiman

1

这是一个常见的问题,猫鼬是异步运行的,你不能在脚本的末尾使用mongoose.disconnect();,这是一种同步的方式。

Topology destroyed表示当您尝试在数据库中插入某些内容时,您正在关闭连接。这是他正在启动的nodejs的行为(并行执行所有异步进程)。

在这种情况下,请尝试删除mongoose.disconnect();。或者在关闭连接之前确保没有异步调用mongodb。

+0

我删除mongoose.disconnect();但仍然是同样的问题。 :( – aiman

+1

嗨@aiman,我有同样的问题,但与回送,它使用自己的mongodb连接器,它使用本地mongodb驱动程序node.js,我不知道该怎么处理它,你找到一个解决方案吗? – demsey

+0

是的解决方案是由“穆斯塔法马蒙” – aiman