2016-07-07 71 views
0

我使用Nodejs作为应用程序API的后端,但是我意识到当有2个不同的用户继续请求同一个方法时,从MySQL请求返回的数据可能会混合这里是我的代码:来自API的2个并发请求数据混合起来

router.get('/v1/getList', function(req, res) { 
    model.getList(loginUser, function(groups){ 
     if(!groups.length){ 
      res.json({data: '', success: false, message: 'No record found.'}); 
     } else{ 
      console.log("User:"+loginUser+", Length:"+groups.length); 
      res.json({data: groups, success: true, message: ''});      
     } 
    }); 
}); 

loginUser是用户ID。在正常情况下,终端输出会像下面,其中用户1有2项和用户2有3项:

User:1, Length:2 
User:2, Length:3 
User:1, Length:2 
User:2, Length:3 
and so on... 

但是,一旦我不断刷新屏幕和终端可能返回:

User:1, Length:2 
User:2, Length:3 
User:1, Length:3 
User:2, Length:2 

我怀疑用户2的数据请求正在被用户1访问,反之亦然,请问我该如何解决这个问题?

+1

'loginUser'从哪里来。如果它是一个模块级别或全局级别的变量,那么这对于一个node.js应用程序来说是不允许的。您可能需要从特定于当前请求的登录会话对象中获取'loginUser'(以便在同时发生多个请求时不会感到困惑)。 – jfriend00

+0

你在哪里存储'loginUser'?用户有什么不同?还是被覆盖? – Oxi

+0

@ jfriend00 @Oxi是'loginUser'是一个全局变量,它的值是使用中间件设置的,只要API请求包含'v1',它就会解码访问令牌并将相应的用户ID存储到'loginUser'这个变量中,是我应该在'loginUser'前加一个'var'? – Ping

回答

1

您不能使用全局变量从中间件中存储loginUser。在同一时间可以有多个请求在飞行中。像这样的全球性混合来自多个请求的数据。

解决此问题的常用方法是使用中间件将数据存储在request对象本身中。然后您可以从您的实际请求处理程序访问request对象上的该属性。由于请求对象对于此特定请求是唯一的,因此不同用户的请求之间不存在数据交叉耦合。

您的请求处理程序变成这样(使用req.loginUser):

router.get('/v1/getList', function(req, res) { 
    model.getList(req.loginUser, function(groups){ 
     if(!groups.length){ 
      res.json({data: '', success: false, message: 'No record found.'}); 
     } else{ 
      console.log("User:"+loginUser+", Length:"+groups.length); 
      res.json({data: groups, success: true, message: ''});      
     } 
    }); 
}); 

而且,你必须修改你的中间件设置req.loginUser而不是全局变量。

+0

是的,它解决了我的问题!非常感谢你!还有一个问题,当使用'socket.emit'发送请求时,我必须手动解码访问令牌而不使用中间件,所以没有'request'对象,那么我应该如何解决它? – Ping

+0

@Ping - 对不起,但我不明白你在问这个新问题。如果相关,您可以将属性附加到'socket'对象本身。您从不会在node.js中使用全局变量来请求特定的存储,因为这会破坏您处理来自多个用户的请求的能力。 – jfriend00