开发者问题收集

来自 nodejs 的 mongodb 调用的返回值

2012-05-20
3755

如何从 mongojs 查询返回数组。 我使用 nodejs 执行了以下查询,并将其放入本地运行的 mongodb 数据库中。 Mongojs 正在处理事务。 我的问题是:如何从以下函数调用返回数组。

    var databaseUrl = "users";
    var collections = ["users","reports"]; 
    var db = require('mongojs').connect(databaseUrl, collections );

    function usernameFromId(callback){
      db.users.find({}, function(err, result) {
        if(err || !result) console.log("Error");
          else{
           callback(result);
          }
      });
     };


    var x = usernameFromId(function(user){
    return user;
    });

    console.log(x);

这里 x 未定义,我如何才能使返回值成为数组,以便我可以通过 x.name、x.email 等访问元素。

这就是数据库中保存的内容。

 { "_id" : ObjectId("4fb934a75e189ff2422855be"), "name" : "john", 
 "password":"abcdefg", "email" : "[email protected]" }
 { "_id" : ObjectId("4fb934bf5e189ff2422855bf"), "name" : "james", 
 "password" :"123456", "email" : "[email protected]" }
1个回答

您无法使用异步函数 return 。您必须在回调中处理结果:

usernameFromId(function(user){
    console.log(user);
});

这是由于异步编程的性质:“ 立即退出 ,设置一个回调函数以供将来某个时间调用。” 这意味着:

var x = usernameFromId(...);

在实际调用回调之前,将对其进行完整评估(包括将 x 设置为从 usernameFromId 返回的 undefined 值):

function (user) {
    return user;
}

并且,至少在当前的 ECMAScript 5 标准下,您无法绕过此问题。由于 JavaScript 是单线程的,任何等待回调的尝试都只会锁定单个线程,从而使回调和 返回用户 永远处于事件队列中的待处理状态。

Jonathan Lonowski
2012-05-20