对不起,如果这听起来很傻,我还在学习服务器端的Javascript。我在app.js文件中有这段代码。
var test;
UserModel.findOne({name: 'guest'}, function(err, user) {
test = user.name;
});
console.log(test);
我知道这不起作用,因为UserModel.findOne
是异步的,所以一切都必须在回调中发生。例如。 console.log(test)
可以在UserModel.findOne
完成之前执行。
问题
如果我在app.js文件中声明var test
,是否可以通过user.name
(通过UserModel.findOne
)获取值?
我这样做的原因是因为我希望事先从数据库中检索所有这些信息。因此,每次需要用户名称时,我都不必进行数据库查询。
如果这个想法不合理,是否有类似的选择?
修改/更新
这不用于身份验证/登录。我打算让所有用户都能访问变量test
及其内容。
基本上,我问为什么变量test
永久不会设置为user.name
,而只是在回调范围内。并且,是否可以永久设置变量?
答案 0 :(得分:2)
示例:
var users = {};
function getUser(username, callback) {
if (typeof users[username] !== 'undefined') {
callback(users[username]);
} else {
Users.findOne({"name":username}, function(err, user) {
users[username] = user;
callback(user);
});
};
};
这将始终从缓存或mongodb返回指定用户。它的名称与findOne相同:
getUser('guest',function(user){ 的console.log(用户); });
之后,您可以直接从缓存中访问用户或将其分配给变量。但是你必须首先确保getUser成功。
关于Node.js最难的事情之一是要理解代码是在书面源的正常流程之外调用的。代码跟随对带回调函数的调用是不够的。
答案 1 :(得分:1)
考虑到您应用的所有用户都会分享该test
变量,这似乎是一个坏主意。如果您不想根据需要查找,那么这是您在用户会话中存储的数据类型。
修改强>
只要您在全局或模块范围内声明test
,就会在findOne
回调中永久设置。
答案 2 :(得分:0)
是的,您可以将结果应用于更高范围的变量,例如这应该有效;
var test;
function getTest() {
console.log(test);
}
UserModel.findOne({name: 'guest'}, function(err, user) {
test = user.name;
getTest();
});
答案 3 :(得分:0)
查看以下六氰化物的答案。在异步回调中使用回调为我的项目节省了同样的问题。