节点 – MongoDB:集合使用mongodb驱动程序找不到任何东西。 壳牌确实返回价值

我有一个简单的代码试图在MongoDB集合中查找文档。 我可以通过Mongo的shell客户端find它,但是通过Node是不可能的,我尝试了很多方法无济于事。

首先来自MongoDB本身的结果:

raul@rmedina:~$ mongo sdk_back MongoDB shell version: 2.0.6 connecting to: sdk_back > db.metadatos.find(); { "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } > db.metadatos.findOne({"tipo":"proceso"}); { "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } > db.metadatos.findOne({tipo:"proceso"}); { "_id" : ObjectId("514cbee35c10db0299c015c7"), "tipo" : "proceso" } > 

正如你所看到的,find和findOne查询都可以工作。 现在这是我的节点代码:

  var utils = require('../utils/utils.js'), Server = require('mongodb').Server, Db = require('mongodb').Db; exports.procesaJSON = function (input_json){ if(!utils.validaJSON(input_json)) throw new Error('JSON de entrada inválido!'); //procesamos input_json = JSON.parse(input_json); if(typeof(input_json.id) === "undefined") throw new Error('JSON de entrada inválido (falta propiedad \"id\"!'); //obtenemos meta-data de mongo var db = new Db("sdk_back", new Server('localhost',27017,{auto_reconnect:true, poolsize:1}),{safe:true}); db.open(function(err,db){ if(!err){ db.collection("metadatos",function(err,collection){ console.log('Entering collection meta-data'); if(!err){ console.log('Lets find one'); collection.findOne({"tipo":"proceso"},function(err,doc){ console.log('Results of findOne'); if(!err){ console.log(doc); } else{ throw new Error('Error al buscar meta_data!'); } if(doc){ console.log('We have results'); } else{ console.log('We dont have results'); } }); } else{ throw new Error('Error al buscar meta_data 1!'); } }); } else{ throw new Error('Error al conectarse a MongoDB!'); } db.close(); }); }; 

输出总是:

 raul@rmedina:~$ node pu_entrypoint.js Entering collection meta-data Lets find one raul@rmedina:~$ 

正如你所看到的,文本“findOne的结果”的日志从不显示,所以findOne方法实际上从来没有得到执行,或类似的东西。

我的问题是,我做错了什么? 我已经下了并重新创build集合,删除了数据库,甚至我改变了我的/数据/数据库目录为Mongo,无济于事。

我究竟做错了什么?

谢谢!

[已解决]更新:问题是与db.close()。 节点beignasynchronous,在到达集合的查找之前到达db的closures,所以当然无法find一个东西。 只是在我最后一次callback中移动db.close,解决了这个问题。 这里是编辑的代码:

 db.open(function(err,db){ if(!err){ db.collection("metadatos",function(err,collection){ console.log('Entering collection meta-data'); if(!err){ console.log('Lets find one'); collection.findOne({"tipo":"proceso"},function(err,doc){ console.log('Results of findOne'); if(!err){ if(doc){ console.log('We have results'); console.log(doc._id); } else{ console.log('We dont have results'); } /********** MOVED db.close() HERE ********************/ db.close(); } else{ throw new Error('Error al buscar meta_data!'); } }); } else{ throw new Error('Error al buscar meta_data 1!'); } }); } else{ throw new Error('Error al conectarse a MongoDB!'); } /********** REMOVED db.close() FROM HERE ********************/ }); 

问题是与db.close()。 节点在达到集合的查找之前开始asynchronous并到达db的closures,所以偏离路线找不到东西。 在最后一个callback中移动db.close,解决了这个问题。 这里是编辑的代码:

  db.open(function(err,db){ if(!err){ db.collection("metadatos",function(err,collection){ console.log('Entering collection meta-data'); if(!err){ console.log('Lets find one'); collection.findOne({"tipo":"proceso"},function(err,doc){ console.log('Results of findOne'); if(!err){ if(doc){ console.log('We have results'); console.log(doc._id); } else{ console.log('We dont have results'); } /********** MOVE db.close() HERE ********************/ db.close(); } else{ throw new Error('Error al buscar meta_data!'); } }); } else{ throw new Error('Error al buscar meta_data 1!'); } }); } else{ throw new Error('Error al conectarse a MongoDB!'); } /********** REMOVED db.close() FROM HERE ********************/ });