NodeJS - 如何从模块返回数组

时间:2012-07-28 22:20:28

标签: arrays node.js module export return

我有一个名为' userinfo.js'的模块。从DB检索有关用户的信息。这是代码:

exports.getUserInfo = function(id){
db.collection("users", function (err, collection) {
    var obj_id = BSON.ObjectID.createFromHexString(String(id));
    collection.findOne({ _id: obj_id }, function (err, doc) {
        if (doc) {
            var profile = new Array();
            profile['username']=doc.username;
            return profile;
        } else {
            return false;
        }
    });
});
}

从index.js(索引页的控制器,我试图访问userinfo)以这种方式:

var userinfo = require('../userinfo.js');

var profile = userinfo.getUserInfo(req.currentUser._id);
console.log(profile['username']);

Node给我发了这样一个错误:

console.log(profile['username']);   -->     TypeError: Cannot read property 'username' of undefined

我做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:9)

您将返回profile['username']而不是profile数组本身。

此外,您可以返回false,因此在访问之前应先检查profile

EDIT。再看一遍,你的return语句在回调闭包内。所以你的函数返回undefined。一种可能的解决方案,(保持节点的异步性):

exports.getUserInfo = function(id,cb){
db.collection("users", function (err, collection) {
    var obj_id = BSON.ObjectID.createFromHexString(String(id));
    collection.findOne({ _id: obj_id }, function (err, doc) {
        if (doc) {
            var profile = new Array();
            profile['username']=doc.username;
            cb(err,profile);
        } else {
            cb(err,null);
        }
    });

}); }

    var userinfo = require('../userinfo.js');

    userinfo.getUserInfo(req.currentUser._id, function(err,profile){

      if(profile){
       console.log(profile['username']);
      }else{
       console.log(err);
      }
});