2017-04-07 68 views
0

我想知道是否有可能有同步塊中的Node.js應用。我是Node的總新手,但我無法找到任何具體的行爲的好答案。同步塊中的Node.js

我的實際應用程序會涉及更多一點,但基本上我想要做的是支持GET請求和POST請求。 POST請求會將一個項目追加到存儲在服務器上的數組中,然後對數組進行排序。 GET請求將返回數組。顯然,多個GET和POST同時發生,我們需要一個正確性保證。這是一個什麼樣的代碼將理論上看起來像一個非常簡單的例子:

var arr = []; 

app.get(/*URL 1*/, function (req, res) { 
    res.json(arr); 
}); 

app.post(/*URL 2*/, function (req, res) { 
    var itemToAdd = req.body.item; 
    arr.push(itemToAdd); 
    arr.sort(); 
    res.status(200); 
}); 

什麼,我擔心的是一個GET請求返回數組它或排序之前,但該項目被追加後,更有甚者,回國數組作爲它正在排序。在像Java這樣的語言中,我可能只會使用ReadWriteLock。從我讀過有關節點的不同步,它不會出現arr將在保留此行爲的方式來訪問,但我很樂意被證明是錯誤的。

如果無法修改代碼,我目前不得不支持此行爲,那麼是否有其他替代方法或解決方法來讓應用程序執行我想要的操作?

回答

1

我擔心的是一個GET請求在數組被排序之前,但在該數組被添加之後返回數組,或者更糟糕的是,在數組被排序後返回數組。

在這裏你的代碼的情況下,你不必擔心(儘管閱讀,因爲你可能想擔心其他事情!)。 Node.js是單線程的,因此每個函數都將完整運行,然後將控制權返回給事件循環。由於所有的數組操作都是同步的,因此您的應用程序會在回覆GET請求之前等待數組操作完成。

當然要注意的一件事是,如果(例如).sort()需要很長時間。如果確實如此,那麼您的服務器會在發生時阻止。這就是人們傾向於支持異步操作的原因。但是如果你的陣列是保證小和/或這是與用戶(比如,它是一個小公司內聯網應用)的數量有限的應用程序,那麼你在做什麼可能工作得很好。

爲了更好地理解整個單線程+事件循環的事情,我推薦使用Philip Roberts's talk on the event loop

+0

這正是我需要知道!這意味着我可能必須爲我的項目使用多個服務器,但至少我不需要明確地處理線程。我的陣列平均大約需要50個元素,在最極端的情況下大約需要500個元素,所以阻止這一點並不是一個大問題。 –