2011-09-12 26 views
1

我一直在使用express和mongoDB設計node.js中的web應用程序,而且我發現我在腳本中聲明的任何變量都可供所有用戶訪問,因爲節點作爲單個線程運行。例如,我使用的是服務器端形式驗證器,這裏是一塊它:node.js中的變量「安全性」

app.post('/purchase', requireLogin, function(req, res) { 
var b = req.body; 
var ee; 
for (i in b) { 
    if (!validatePresenceOf(b[i])) { 
     var ee="Please fill out all fields.<br />\n"; 
    } 
} 

var exp = b.exp_mm+"/"+b.exp_yy; 
var d = /^(0[1-9]|1[012])[- /.]\d\d$/ 
if (!d.test(expiration)) { 
    ee+="Expiration date is invalid.<br />\n" 
} 

if (!isValidCreditCard(b.card_type, b.card_num)) { 
    ee+="Credit card number is invalid.<br />\n"; 
} 
}); 

如果另一個用戶進行購買在幾乎相同的時間,我想知道,可以變量b通過第二重新定義驗證者完成之前的請求?如果可以的話,那麼最好的解決辦法是什麼?每當我聲明一個變量時,這會發生什麼?看起來這可能會導致一些安全問題,如果變量在一個過程完成之前被更改。

謝謝!

+2

確實是單線程的。這意味着一次只能運行一次js代碼。因此,您想象中的這些問題(函數並行運行兩次)不會發生,因爲一次只能運行一個代碼塊 – Raynos

+0

@Raynos還存在詞法範圍的問題;) – jcolebrand

回答

2

不,這個變量不會被共享,因爲它只會對因爲函數結束而操作的進程有詞法範圍。

你在函數中用var b聲明它的事實定義它具有該詞彙範圍。

+0

好的,謝謝!我擔心我不得不返回併爲req.session分配一堆隨機變量或其他東西。 – Ben

+0

沒有,但那些人會遭受同樣的命運。這完全是關於範圍,這是一個很好的事情來閱讀。此外,在JavaScript中使用「閉包」一詞。 – jcolebrand

+0

http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – jcolebrand