2013-03-04 52 views
2

我正在探索帶有NodeJS的服務器端JavaScript並使用ExpressJS編寫REST API。我的REST API用於配置設備,就像配置您的家庭路由器一樣。我想阻止並行REST調用嘗試配置客戶端而不阻止多個非配置請求。如何序列化NodeJS?

實例API資源:

/api/config/network 
/api/config/filesystem 

在我的例子API,概念,我想一個客戶端能夠配置網絡資源,而另一個客戶端配置文件系統資源,同時允許其他客戶端查詢這些資源。

我不確定如何使用JavaScripts異步編程模型完成此操作。我來自非異步編程背景(多線程C++)。我在解決這個問題時遇到了困難,並想知道如何手工解決這個問題,如果我必須編寫插件/模塊,該怎麼辦?

+1

有庫,幫助你搞定,比如https://github.com/caolan/async – bfavaretto 2013-03-04 19:12:41

+1

你有沒有嘗試這個東西了嗎?當他們發佈了一些顯示他們已經嘗試過的代碼時,幫助他們通常會更容易。 – tkone 2013-03-04 19:13:49

+0

@tkone我的問題是我不確定要嘗試什麼。 – snowballhg 2013-03-04 19:15:58

回答

8

當您的快速應用程序獲取編輯配置的請求時,將一個項目添加到async.js queue配置爲併發1.這將防止> 1併發嘗試編輯遠程配置。僞代碼如下:

  • 在應用程序啓動,在應用程序啓動定義updateNetworkConfig功能
  • ,創建併發隊列1
    • var networkQueue = async.queue(updateNetworkConfig, 1);
  • REST來如PUT /將新配置作爲JSON中的請求主體的api/config/network
  • 將一個項目添加到隊列中,傳遞新的配置數據
    • networkQueue.push(req.body.config);
    • req.body由bodyParser提供連接中間件)
  • 重複設置爲每個獨立的配置:文件系統等

你需要一羣其他水暖處理回調並在其配置保存時通知REST客戶端。如果隊列不爲空,則由您決定是否排隊呼叫或拒絕新呼叫。

既然你堅持不學習和使用真棒的async.js庫,這將提高你與異步編程的流暢性,並教你有價值的東西,這裏的交易。使用這個稱爲變量的東西。

var updatingNetwork = false; 
app.put('/api/config/network', function (req, res) { 
    if (updatingNetwork) { 
     return res.status(409).send("Try later"); 
    } 
    updatingNetwork = true; 
    updateNetworkConfig(req.body.config, function (error) { 
     updatingNetwork = false; 
     if (error) { 
      return res.status(500).send(error); 
     } 
     res.status(200).send("done"); 
    }); 
}); 
  • 當一個請求到來時,如果updatingNetwork是真的,你知道已經有工藝的更新,無論是排隊這一個或拒絕。
+0

這是一個很好的答案,我可以如何使用async.js做到這一點,但是我可以用什麼方法來解決這個問題,而不使用async.js或其他庫? – snowballhg 2013-03-04 19:41:49

+0

一個了不起的帖子先生:) – snowballhg 2013-03-04 20:04:19