我在Node JS
新,我不知道是否下面提到的代碼片段有多區段的問題。是否有任何風險在節點JS中讀取/寫入不同「會話」中的相同文件內容?
考慮我有節點JS服務器(express
),我聽一些POST
要求:
app.post('/sync/:method', onPostRequest);
var onPostRequest = function(req,res){
// parse request and fetch email list
var emails = [....]; // pseudocode
doJob(emails);
res.status(200).end('OK');
}
function doJob(_emails){
try {
emailsFromFile = fs.readFileSync(FILE_PATH, "utf8") || {};
if(_.isString(oldEmails)){
emailsFromFile = JSON.parse(emailsFromFile);
}
_emails.forEach(function(_email){
if(!emailsFromFile[_email]){
emailsFromFile[_email] = 0;
}
else{
emailsFromFile[_email] += 1;
}
});
// write object back
fs.writeFileSync(FILE_PATH, JSON.stringify(emailsFromFile));
} catch (e) {
console.error(e);
};
}
所以doJob
方法接收_emails
名單,我更新(計數器+1)從對象emailsFromFile
這些電子郵件從文件加載。
考慮我在同一時間得到2個請求,它觸發doJob
兩次。恐怕一個請求從文件加載emailsFromFile
,第二個請求可能會更改文件內容。
任何人都可以在這個問題上傳播光?
問題是:當一個'會話'加載電子郵件計數器,讓它說'3',並運行+1,然後它將其存回,其他會話已更新此計數器,因此它實際上應該是5,但第一次會話商店4 intead –
@MaximShoustin - 請再次閱讀我的答案。 'doJob()'在運行時沒有其他請求可以運行。所以在'doJob()'運行時,沒有其他任何事情可以改變會話。這是因爲'doJob()'完全是同步代碼。如果它是異步的,那將是一個不同的故事。 – jfriend00
有你,謝謝 –