我在移动服务上有一个负责用户登录的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上托管,这两个免费计划)有关吗?这可能与并发相关吗?
答案 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函数,以便它可以访问请求和响应对象。如果需要在其他地方重用此函数,则必须将请求和响应对象作为参数传递给函数。
希望这有帮助!