如何从node.js中的mongodb获取用户信息

时间:2013-08-31 13:16:47

标签: node.js mongodb

对于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()函数外部它无论如何都会失败。

2 个答案:

答案 0 :(得分: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();
});

});

答案 1 :(得分:0)

请清楚一点,各种数据库调用是利用Javascript Promises的异步操作。对findOne的调用返回Promise对象,而不是找到的文档。也就是说,

app.get('/uploadimage', function(request, response){

if(request.cookies.sessionid == request.session.id){
    response.render("uploadimage.hbs", {layout:'mainlogedin.hbs', token:request.csrfToken()})
}else{
    response.render("uploadimage.hbs", {token:request.csrfToken()})
}
})

<form method="POST" action="/addimage" enctype="multipart/form-data">
<div class="form-group">
    <label for="headline">Headline</label>
    <input class="form-control" type="text" id="headline" name="headline" required>
</div>
<div class="form-group">
    <label for="image" required>Choose a image</label>
    <input type="file" class="form-control-file" id="image" name="image" value="upload image" required accept="image/x-png,image/jpeg">
</div>
<input type="hidden" name="_csrf" value="{{token}}">
<button type="submit" class="btn btn-primary mb-2">Create</button>
</form>

在功能上等同于

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

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