2016-07-07 106 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