2012-03-10 117 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。我會怎麼做呢? – 2012-03-11 00:22:55

+0

@majicbunnie如果你的應用程序流程的一部分是異步的,這使得整個程序都是異步的,並且你需要有這樣的回調。爲了簡化這一點並使代碼更易於使用,您應該查看一個名爲「期貨」或「承諾」的概念。它可以讓你避免創建瘋狂深層嵌套的回調。如果你搜索它,你會發現很多信息,但你可以從這裏開始:http://howtonode.org/promises – nickf 2012-03-11 10:16:57

+0

和OP一樣。如果沒有使用Promises或類似的東西,我們怎麼能夠使用一個簡單的程序從authenticate()函數本身返回這些值呢?我可以理解這個解決方案,但是我對這個例子的用法感到困惑。它看起來並不像它回答OP的問題。 – jagc 2015-12-03 09:03:17