API移动服务在cuncurrent访问时超时

时间:2016-05-17 21:11:31

标签: azure azure-mobile-services

我在移动服务上有一个负责用户登录的API,即它接受用户名和密码,检查用户是否存在,并回复带有其他详细信息的令牌。

问题是,当客户端应用程序正在运行并且两个不同的客户端同时调用此API时,它会返回一个客户端的超时,而另一个客户端会获得另一个客户端的回复。

以下是代码:

var crypto = require('crypto');
var iterations = 1000;
var bytes = 32;   
var masterKey = "XXXXXXXXXXX";
var _request;
var _response;


exports.post = function(request, response) {
        var username = request.body.username;
        var pass = request.body.password;
       _request = request;
    _response = response
        //_request.respond(400,"Usuário não encontrado.");
        validateUserNamePassword(username, pass)      

}   

function validateUserNamePassword(username, pass){

    var accounts = _request.service.tables.getTable('contaserv');

    accounts
        .where({ username : username , password : pass})
        .read({
            success: function(results) 
            {
                if (results.length === 0) 
                {                                          
                   _request.respond(200, {
                                id: -1,
                                userName: "-1",
                                token: "-1"                       
                    })
                }
                else 
                   {
                        var account = results[0];                       
                            var buff = new Date();
                            var expiry = buff.getTime() + 60 * 60000;
                            var Id = account.id;     
                            var user = account.username;                             
                            _request.respond(200, {
                                id: Id,
                                userName: user,
                                token: zumoJwt(expiry, user, Id, masterKey)                             
                    });

                    }
                },  
                error: function(err) {
                        console.warn(err);
                        _request.respond(401, "Problema ao realizar login");
                }   

            });
}

问题可能与移动服务计划或数据库(也在Azure上托管,这两个免费计划)有关吗?这可能与并发相关吗?

1 个答案:

答案 0 :(得分:1)

这是由于您共享请求和响应对象的方式(即使用名为_request和_response的模块级变量)。第二个请求正在替换值,因此两个请求的响应都将返回到第二个请求。

解决此问题的适当方法是使用作用域来允许访问对象:

var crypto = require('crypto');
var iterations = 1000;
var bytes = 32;   
var masterKey = "XXXXXXXX";

exports.post = function(request, response) {
    var username = request.body.username;
    var pass = request.body.password;
    validateUserNamePassword(username, pass)      

    function validateUserNamePassword(username, pass){
        var accounts = request.service.tables.getTable('contaserv');

        accounts
            .where({ username : username , password : pass})
            .read({
                success: function(results) {
                    if (results.length === 0) {                                          
                       request.respond(200, {
                            id: -1,
                            userName: "-1",
                            token: "-1"                       
                        });
                    } else {
                        var account = results[0];                       
                        var buff = new Date();
                        var expiry = buff.getTime() + 60 * 60000;
                        var Id = account.id;     
                        var user = account.username;

                        request.respond(200, {
                            id: Id,
                            userName: user,
                            token: zumoJwt(expiry, user, Id, masterKey)                             
                        });
                    }
                },
                error: function(err) {
                    console.warn(err);
                    request.respond(401, "Problema ao realizar login");
                }
            });
    }
}   

注意如何在exports.post函数中移动validateUserNamePassword函数,以便它可以访问请求和响应对象。如果需要在其他地方重用此函数,则必须将请求和响应对象作为参数传递给函数。

希望这有帮助!