【问题标题】:ASYNC issue on node.jsnode.js 上的异步问题
【发布时间】:2015-11-21 01:20:31
【问题描述】:

我是 node 新手,我尝试制作一个带有 authentification 的基本应用程序。数据存储在 mongoDB 远程服务器上。 我的 HTML 表单 POST 数据到我的服务器 URL。 路线在这里:

app.post('/auth', function(req, res){
handleRequest(req, res);

});

以及被调用的处理程序:

function handleRequest(request, response) {
    if (request.method == 'POST') {
        console.log("Trying to get POST");
        var body = '';
        request.on('data', function (data) {
            body += data;
        });

        // Get datas, parse them and create user with it
        request.on('end', function () {
            var data = JSON.parse(body);
            var login = data.login;
            var password = data.password;
            var email = data.email;

            myUser = userClass.create(login,email,password);

            console.log ("email : "+email);
            console.log ("password : "+password);


            // authenticate with user
            var auth = userClass.authenticate(myUser,function(result){
                console.log("result = "+result);
                    });

             });
    }
}

userClass.authenticate:

exports.authenticate = function(user,callback){
    var result = "false";
    var query = User.where(
    { 
        email : user.email,
        password : user.password

    });
    query.findOne(function(err,user){
        if(err){return handleError(err);}
        if(user){
            result = "true";
        }
        console.log(user);
    });
    console.log("callback inc")
    callback(result);
}

我很确定它没有经过优化,但这不是我想要的。 当我启动服务器并向它发送一些 POST(正确)数据时,会发生这种奇怪的事情:

找到了我存储在远程数据库中的用户,所以在 userClass.authenticate result = true 但是当回调函数运行时,日志说它是假的。我在回调中做错了吗?

【问题讨论】:

    标签: javascript node.js asynchronous express callback


    【解决方案1】:

    如果 query.findOne 是异步的,您将在 findOne 完成之前调用回调。将回调(结果)放在 findOne 回调中 - 像这样

    exports.authenticate = function(user,callback){
        var result = "false";
        var query = User.where(
        { 
            email : user.email,
            password : user.password
    
        });
        query.findOne(function(err,user){
            if(err){return handleError(err);}
            if(user){
                result = "true";
            }
            console.log(user);
            callback(result);
        });
    }
    

    【讨论】:

    • 这是我以前没有看到的一点。回调调用必须在调用函数内部完成?感谢快速响应,我标记为在 2 分钟内解决
    • Callback calls must been done inside the calling function 在这种情况下,是的,因为 findOne 是异步的,在调用 findOne 回调之前你不会有值,所以在这个回调中你调用你的回调
    猜你喜欢
    • 2023-03-04
    • 2013-03-25
    • 2015-02-19
    • 1970-01-01
    • 2013-11-09
    • 2017-08-11
    • 2015-06-20
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多