0

对 mongo 来说是全新的,我已经检查了几个小时的示例,试图检查用户是否存在于这个集合中:

{ "name" : "chrispy", "pass" : "xxxx", "_id" : ObjectId("5221b29b69f9e9b11a000001") }

但无法匹配名称并获得结果,我尝试了很多示例,但没有运气。

在控制台中运行良好:

mongo main
> db.users.findOne({name : 'chrispy'})
{
        "name" : "chrispy",
        "pass" : "xxxx",
        "_id" : ObjectId("5221b29b69f9e9b11a000001")
}
>

一旦我可以匹配名称,我将匹配密码。但甚至无法匹配用户名。帮助 = 1000 谢谢!

var name = 'chrispy';
var pass = '';

console.log("About to check for name and pw");

Mongo.connect('mongodb://127.0.0.1:27017/main', function(err, db) {
    if(err) throw err;
    var collection = db.collection('users');

    // does user exist
    var doc = collection.findOne({name : name}, function(err,doc){
        if(err) throw err;
        if(doc)
            console.log("1 Found: "+name+", pass="+doc.pass);
        else
            console.log("1 Not found: "+name);

    });
    if(doc)
            console.log("2 Found: "+name+", pass="+doc.pass);
        else
            console.log("2 Not found: "+name);
    db.close();
});

控制台输出:

About to check for name and pw
2 Not found: chrispy

它甚至似乎没有进入 findOne() 函数,在 findOn() 函数外部它无论如何都会失败。

4

2 回答 2

0

所以这里是它开始工作之前的更改,删除了 var Doc = ,并且只有在 findOne() 中的函数被触发后才关闭数据库,否则它会在结果之前关闭数据库。

var name = 'chrispy';
var pass = '';

console.log("About to check for name and pw");
Mongo.connect('mongodb://127.0.0.1:27017/main', function(err, db) {
if(err) throw err;
var collection = db.collection('users');

// does user exist
collection.findOne({name : name}, function(err,doc){
    if(err) throw err;
    if(doc)
        console.log("Found: "+name+", pass="+doc.pass);
    else
        console.log("Not found: "+name);
    db.close();
});

});

于 2013-09-01T03:38:20.827 回答
0

需要明确的是,各种数据库调用是利用 Javascript Promises 的异步操作。对 findOne 的调用返回一个 Promise 对象,而不是找到的文档。那是,

collection.findOne(
    {name: name}, 
    function(err,doc) { 
      /* handle err or process doc */
    }
);

在功能上等同于

collection.findOne(
    {name: name}
).then(
    // resolved handler
    function(doc) { 
       // process doc 
    }, 
    // rejected handler
    function(err) { 
      // handle err 
    }
);

您的代码正在启动异步 findOne 调用,然后在调用完成之前关闭数据库(即,承诺已解决或被拒绝)。如果您需要关闭数据库,您应该在获取文档后在回调中执行此操作。

于 2020-10-13T21:39:29.667 回答