var userLat = db.collection('users', function (err, document){
document.findOne({_id: loggedUserID}, function(err, docs) {
console.log(docs.currentUserLat);
})
});
这是我的代码,我试图获取控制台登录变量的值。我无法找到正确的语法来执行此操作。控制台日志确实返回正确的值,只需将其放入变量即可。感谢一些帮助。
答案 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);
你不确定你会得到输出。另一种方法是将所有内容放入另一个回调中。