【问题标题】:nodeJS return value from callbacknodeJS从回调返回值
【发布时间】:2012-03-27 21:45:42
【问题描述】:

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

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 中返回,并且在回调完成之前拥有验证块。我该怎么做?

【问题讨论】:

    标签: mysql node.js callback


    【解决方案1】:

    你的外部函数需要提供一个回调本身,一旦 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');
        }
    }); 
    

    【讨论】:

    • 谢谢,这似乎是一个有趣的解决方案,但是我仍然有点不确定如何从中获得价值。假设如果身份验证失败,我希望请求在此时停止,否则继续应用程序。似乎我在那个回调中返回的任何东西都将作为回调返回值被吃掉,所以我也不能简单地从这里返回真/假。我该怎么做呢?
    • @majicbunnie 如果您的应用程序流程的一部分是异步的,这会使整个流程异步,并且您需要自始至终都有这样的回调。为了简化这一点并使您的代码更易于使用,您应该查看一个称为“期货”或“承诺”的概念。它使您免于创建疯狂的深度嵌套回调。如果您搜索它,周围有很多信息,但您可以从这里开始:howtonode.org/promises
    • 与 OP 相同。如果不使用 Promises 或类似的东西,如何能够使用一个简单的程序从 authenticate() 函数本身返回这些值?我可以理解解决方案,但我对示例用法感到困惑。它看起来不像回答 OP 的问题。
    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多