0

DB からユーザーに関する情報を取得する「userinfo.js」というモジュールがあります。コードは次のとおりです。

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']);

ノードは私にそのようなエラーを返します:

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

私が間違っていることは何ですか?前もって感謝します!

4

1 に答える 1

9

配列自体profile['username']ではなく、返されます。profile

また、戻る可能性があるため、アクセスする前にfalse確認する必要があります。profile

編集。もう一度見てみると、returnステートメントはコールバッククロージャ内にあります。したがって、関数はundefinedを返します。考えられる解決策の1つ(ノードの非同期性を維持):

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);
      }
});
于 2012-07-28T22:37:12.407 に答える