从回调函数中返回nodeJS的值

8

我正在构建一个应用程序,在其中在特定调用中,必须阻止并等待身份验证查询的结果,然后才能继续。

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;
}
);
}

我希望能够从authenticate()函数本身返回这些值,而不是内部匿名函数selectCb,并且在回调完成之前阻塞authenticate。我该如何处理?

1个回答

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

谢谢,这似乎是一个有趣的解决方案,但我仍然不太确定如何从中获取值。比如说,如果身份验证失败,我希望请求在此处停止,否则继续应用程序。似乎在回调函数中返回的任何内容都将被视为回调函数的返回值,因此我也不能简单地从中返回 true/false。我该怎么做呢? - majic bunnie
如果你的应用程序流程中有一部分是异步的,那么整个流程都是异步的,你需要一直使用回调函数。为了简化这个过程并使你的代码更易于处理,你应该看看一个叫做“futures”或“promises”的概念。它可以避免你创建深度嵌套的回调函数。如果你搜索一下,就会发现有很多相关信息,但你可以从这里开始:http://howtonode.org/promises - nickf
和 OP 一样。没有使用 Promises 或类似的东西,如何能够使用一个简单程序从 authenticate() 函数本身返回那些值?我能理解解决方案,但我被示例用法弄混了。它似乎并没有回答 OP 的问题。 - jagc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接