2011-09-12 5 views
1

私はexpressとmongoDBでnode.jsにWebアプリケーションを設計していて、スクリプト内で宣言した変数にはすべてのユーザーがアクセスできるようになっています単一のスレッドとして実行されます。変数bが第二で再定義することができ、node.jsの変数 "security"

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"; 
} 
}); 

別のユーザーが購入ほぼ同時に行う場合、私は疑問に思って:たとえば、私は、サーバー側のフォームバリデータを使用しています、ここでの作品ですバリデータが完了する前にリクエストしますか?可能であれば、これを回避する最良の方法は何でしょうか?これは変数を宣言するたびに発生しますか?これは、プロセスが完了する前に変数が変更された場合に、セキュリティ上の問題を引き起こす可能性があるようです。

ありがとうございます!

+2

実際にはシングルスレッドです。これは、jsコードを一度に一度しか実行できないことを意味します。だから、あなたが想像するこれらの問題(並列に2回実行される関数)は、一度に1ブロックのコードしか実行できないために発生しません。 – 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