node.js - Node - MongoDB : collection don't find anything, 使用 mongodb 驱动程序。 Shell确实有返回值

标签 node.js mongodb

我有一个简单的代码试图在 MongoDB 集合中查找文档。我用Mongo的shell客户端可以正常找到,但是通过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 查询都有效。现在这是我的 Node 代码:

    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:~$ 

如您所见,包含文本“Results of findOne”的日志从未显示,因此 findOne 方法实际上从未被执行,或类似的东西。

我的问题是,我做错了什么?我删除并重新创建了集合,删除了数据库,甚至更改了 Mongo 的/data/db 目录,但都无济于事。

我做错了什么?

谢谢!

[已解决] 更新: 问题出在 db.close() 上。 Node 是异步的,在找到集合之前已经关闭了数据库,所以当然找不到任何东西。只需在我上次回调中移动 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() 上。 Node 开始异步并在到达集合的查找之前到达数据库的关闭,所以当然找不到任何东西。在最后一个回调中移动 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 ********************/
    });

关于node.js - Node - MongoDB : collection don't find anything, 使用 mongodb 驱动程序。 Shell确实有返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15580962/

相关文章:

javascript - 如何映射从数据库中获取的元素?

javascript - 使用 Mongoose 插入文档时出现问题

node.js - 使用express-jwt 仅保护部分路由

node.js - 已安装 Node ,但未安装 NPM

node.js - 通过shell命令在Node.js中执行同步事件

spring - 了解微服务架构

node.js - 如何在 Mongoose 中更新数组值

android - 如何在nodejs服务器中从android连接到mysql?

node.js - 在 Windows 的 Git bash 中启动 node.exe -v 时出现错误 0x2

javascript - 如何在同一个 Angular JS 应用程序中使用具有不同身份验证 header 的不同 API