5

私はnodejsが初めてで、質問があります。

テーブルからIDに言及したフィールドの値を呼び出す関数を作成しようとしています:

function getUserInfo (userID, dynamicField) {
    var query = connection.query('SELECT '+dynamicField+' from users WHERE userID = '+connection.escape(userID));
    query.on('result', function(row) {
        return(row.dynamicField);
    });
};
console.log(getUserInfo(8, userEmail)) //this should get me the userEmail value of the user with userID=8

ただし、「未定義」になります。return ではなく console.log を使用すると、値がログに記録されますが、これは値を取得するために他の関数内で使用される関数としては役に立ちません。

機能を変更するためのヘルプを得ることができれば幸いです。

4

1 に答える 1

11

これは、async/nodejs の初心者によくある間違いです。ノードのイベントループの性質を壊す同期関数内に非同期関数を本質的にラップしました。return 式は、コールバックに置き換える必要があります。下記参照:

// Method
function getUserInfo (userID, dynamicField, callback) {
    var query = connection.query('SELECT '+dynamicField+' from users WHERE userID = '+connection.escape(userID));
    query.on('result', function(row) {
        callback(null, row.dynamicField);
    });
};

// Implementation
getUserInfo(8, userEmail, function(err, result){
    console.log(err || result);
});

慣例により、Nodejs では常にコールバックで最初にエラー オブジェクトを渡します。この場合、キャプチャするエラーがないため、代わりに null を渡します。

于 2012-11-13T17:35:11.420 に答える