0

私の自己定義モジュールには、データベースにクエリを実行し、ユーザー名がデータベースに存在するかどうかを確認するこのメソッドがあります。いくつかの値が返されるようにしたいので、上位レベルでクエリの結果がわかります。

var findUserbyUsername=function(username)
{
    db.users.find({email:username},function(err,result)
    { 

        if(err|!username) {console.log('username not found'); return 0;} 
        else return 1;
    }
    );
}
module.exports.findUser=findUserbyUsername;

app.js では、上記のメソッドを次のように呼び出します

var lt=dbutil.findUser('xxxx@gmail.com');

残念ながら、私は未定義になりました....誰かがこれを回避するのを手伝ってくれますか? または他の提案はありますか?

4

3 に答える 3

2

関数findUserbyUsernameは何も返さないため、undefined. ノードではデータベース操作が非同期であるため、意味のあるものを返すことができず、コールバックを介して機能します。コードを次のように変更します。

var findUserbyUsername = function(username, callback) {
    db.users.find({ email: username }, function(err, result) { 
        if (err || !username) {
            console.log('username not found');
            callback(err? err: 'Username not found');
        } else {
            callback(null, whateverYouWantToReturn);
        }
    });
}
module.exports.findUser = findUserbyUsername;

次のように使用します。

dbutil.findUser('xxxx@gmail.com', function(err, result) {
    // you have the result from findUserbyUsername() in "result", and "err" is set if there was an error
});

(注:はビット単位の演算子であり、実際には論理演算子が必要なif(err|!username)ため、条件も修正しました)|||

(編集: 事実上の標準errパラメータをコールバックに追加)

于 2012-06-07T08:51:48.220 に答える
2

これは非同期コードです。もちろん、何も返されません。次のものが必要になる場合があります。

app.js:

dbutil.findUser( 'xx@gmail.com', function( err, data ) {
    if ( err ) throw err;
    // Handle the datas returned "data"
} );

モジュール:

var findUserByUserName = function( username, callback ) {
    db.users.find( { email: username }, function( err, result ) {
       if ( err || !username ) {
           console.log( 'username not found' );

           // Call the function passed as parameter
           callback( err ); // You give "undefined" as second parameter
       }
       else {
           callback( err, result ); // You give the datas back
       }
    } );
} );
于 2012-06-07T08:51:57.657 に答える
0

問題は、関数内に非同期リクエストがあるため、db.users.find内の戻り値が間違ったスコープにあり、リクエストに戻らないことです。

コードが次のようになるように、2番目のパラメーターとしてコールバック関数を渡す必要があります。

var findUserbyUsername=function(username, cb)
{
    db.users.find({email:username}, cb);
}
module.exports.findUser=findUserbyUsername;

次に、次のように関数を呼び出すことができます。

dbutil.findUser('xxxx@gmail.com', function(err, username) {
    if (err) {
      // Handle err
    } else {
      // Handle username
    }
})
于 2012-06-07T08:55:43.967 に答える