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?
考虑到你的应用程序的所有用户将共享该test
variables,这似乎是一个坏主意。 如果您不想根据需要查看,那么这是您要存储在用户会话中的数据types。
编辑
只要您在全局或模块范围内声明test
,它将永久设置在findOne
callback中。
这个例子:
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的结果