FindOne与MongooseJS,然后提前存储结果?

对不起,如果这听起来很愚蠢,我仍然在学习服务器端的Javascript。 我有我的app.js文件中的这段代码。

var test; UserModel.findOne({name: 'guest'}, function(err, user) { test = user.name; }); console.log(test); 

我明白,这是行不通的,因为UserModel.findOne是asynchronous的,所以一切都必须发生在callback。 例如console.log(test)可以在UserModel.findOne完成之前执行。

如果我在我的app.js文件中声明var test ,有没有办法让user.name (通过UserModel.findOne )的值进入?

我之所以这样做是因为我希望提前从数据库中检索所有这些信息。 这样我就不必每次都需要用户名进行数据库查询。

如果这个想法是不健全的,有没有类似的select?

编辑/更新

这不用于authentication/login。 我打算让所有用户有权访问variablestest及其内容。

本质上,我问为什么variablestest不会永久设置为user.name ,而只是在callback的范围内步进。 而且,是否可以永久设置variables?

考虑到你的应用程序的所有用户将共享该testvariables,这似乎是一个坏主意。 如果您不想根据需要查看,那么这是您要存储在用户会话中的数据types。

编辑

只要您在全局或模块范围内声明test ,它将永久设置在findOnecallback中。

这个例子:

 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); }); }; }; 

这将始终从caching或从mongodb返回指定的用户。 它被称为与findOne相同的方式:

getUser('guest',function(user){console.log(user);});

之后,您可以直接从caching中访问用户或将其分配给variables。 但是,您必须确保getUser首先成功。

Node.js最困难的事情之一就是要理解代码是在写入源的正常stream程之外调用的。 代码仅仅通过callback函数来调用函数是不够的。

是的,你可以将结果应用到更高范围的variables,例如这应该工作;

 var test; function getTest() { console.log(test); } UserModel.findOne({name: 'guest'}, function(err, user) { test = user.name; getTest(); }); 

看看下面的六氰菊酯的答案。 在asynchronouscallback中使用callback为我的项目保存了我的同样的问题。

将variables设置为Mongoose Find的结果