2012-03-10 35 views
7

私は、特定の呼び出しで、私がブロックして、先に進む前に認証クエリの結果を待つアプリケーションを構築しています。nodeJSコールバックからの戻り値

function authenticate(userid, hash) 
{ 
    mysql_client.query("SELECT `hash` FROM `auth` WHERE `userid` = " + userid, function selectCb(err, results, fields) { 
    if (err) 
    { 
     client.send("Error communicating with mysql, please retry your request"); 
     return false; 
    } 

    if(results.length == 0 || results[0].hash != hash) 
    { 
     client.send("Error comparing authentication data with database, please retry request"); 
     return false; 
    } 

    return true; 
} 
); 
} 

は私が認証()関数自体ではなく、内部の匿名関数selectCbからそれらの値を返すことができるようにしたいとコールバックが完了するまでブロックを認証しています。これをやり遂げるにはどうすればいいですか?

答えて

13

あなたの外部関数は、mysql呼び出しが完了した後に実行できるコールバックを提供する必要があります。この線に沿って何か:

function authenticate(user, pass, callback) { 
    mysql_client.query("...", function (err, results, fields) { 
     if (err) { 
      callback("Error communicating ..."); 
     } else if (results.length ...) { 
      callback("Error comparing authentication..."); 
     } 
     callback() 
    }); 
}); 

使用例:

authenticate('jim', '123456', function (err) { 
    if (err) { 
     alert(err); 
    } else { 
     alert('Welcome'); 
    } 
}); 
+0

ありがとう、これは、しかし、私はまだこのうち値を取得する方法が少しわからないよ、興味深いソリューションであることが表示されます。認証が失敗した場合はこの時点で要求を停止したい場合は、アプリケーションを続行します。コールバックが値を返すときに、コールバックで返されたものもすべて食べられるように思われるので、これでtrue/falseを返すことはできません。それをどうやってやりますか? –

+0

@majicbunnieアプリケーションフローの一部が非同期であると、全体が非同期になり、このようなコールバックが必要になります。これを単純化してコードをより使いやすくするには、「先物」または「約束」と呼ばれる概念を見てください。それはあなたが狂って深く入れ子にされたコールバックを作成するのを防ぎます。あなたがそれを検索する場合、周りの情報がたくさんありますが、ここから始めることができます:http://howtonode.org/promises – nickf

+0

OPと同じです。 Promiseなどを使用しないと、単純なプログラムを使用してauthenticate()関数自体からこれらの値をどのように戻すことができますか?私は解決策を理解することができたが、私は例の用法によって混乱した。それはOPの質問に答えるようには見えません。 – jagc

関連する問題