FindOne with MongooseJS然后提前存储结果?

时间:2012-09-22 15:42:50

标签: node.js mongodb mongoose

对不起,如果这听起来很傻,我还在学习服务器端的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,而只是在回调范围内。并且,是否可以永久设置变量?

4 个答案:

答案 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)

查看以下六氰化物的答案。在异步回调中使用回调为我的项目节省了同样的问题。

Set Variable to result of Mongoose Find