设置变量等于mongodb键值

时间:2015-03-29 21:24:10

标签: node.js node-mongodb-native

var userLat = db.collection('users', function (err, document){
    document.findOne({_id: loggedUserID}, function(err, docs) {
       console.log(docs.currentUserLat);
    })
});

这是我的代码,我试图获取控制台登录变量的值。我无法找到正确的语法来执行此操作。控制台日志确实返回正确的值,只需将其放入变量即可。感谢一些帮助。

2 个答案:

答案 0 :(得分:1)

你想用' docs.currentUserLat&#39 ;?做什么?

您可以执行您需要执行的操作,而无需将docs.currentUserLat保存到db.collection调用之外的变量。一些例子:

如果您只是想更改数据库中的文档,请利用Collections API中指定的许多方法:http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html。例如,要更新文档并同时将其重新保存在数据库中:

db.collection('users', function (err, document){
    document.findOneAndUpdate({_id: loggedUserID},
        {currentUserLat: [updated value]},
        function(err, docs) {
            if(err) console.log(err);
        }
    )
});

如果您只想在某个节点函数中使用docs.currentUserLat,则需要在回调中正确嵌套document.findOne函数(反之亦然)。例如,要使用fs模块将currentUserLat写入文件:

var fs = require('fs');
db.collection('users', function (err, document){
    document.findOne({_id: loggedUserID}, function(err, docs) {
        fs.writeFile("pathToYourFile", docs.currentUserLat, function(err) {
            if(err) {return console.log(err);}
        });
    });
});

或者,如果您想发送它以响应简单的http请求:

var http = require('http');
http.createServer(function(request,response){
    db.collection('users', function (err, document){
        document.findOne({_id: loggedUserID}, function(err, docs) {
            response.writeHead(200,{'Content-Type':'text/html'});
            response.end(docs.currentUserLat);
        });
    });
});

要记住的关键是JohnnyHK在评论中说:docs.currentUserLat仅在传递给findOne的匿名函数中可用。所以,无论你需要做什么,都要在这个函数中做。

(阅读JohnnyHK提供的链接是了解Node中异步函数的好方法。另一个是https://github.com/rvagg/learnyounode

答案 1 :(得分:0)

首先,您必须了解how javascript callback works。之后,您会看到没有任何内容将docs.currentUserLat分配给您的userLat变量。这背后的原因是您的docs.currentUserLat仅在回调中可用。以下列方式考虑它:

您的程序已开始执行并遇到以下行:var userLat = ...。这一行告诉:做一个回调(基本上要求其他人做这个工作),你的工作正在执行,程序继续,通过将userLat分配给undefined并进一步执行。然后在某段时间回调完成,console.log为docs.currentUserLat

获得所需行为的一种方法是将userLat设为全局,而不是console.log(docs.currentUserLat);执行userLat = docs.currentUserLat。问题是,如果你这样做,你的userLat最终将具有所需的值(如果回调不会失败),但你无法预测何时。所以,如果你愿意的话

var userLat = db.collection('users', function (err, document){ ... });
.. some other code
console.log(userLat);

你不确定你会得到输出。另一种方法是将所有内容放入另一个回调中。