2011-06-01 44 views
5

我正在使用NodeJS來運行套接字服務器(使用socket.io)。當客戶端連接時,我想要打開並運行一個模塊,它會執行一些操作。即使我儘可能地嘗試捕獲,但是當這個模塊拋出一個錯誤時,它顯然會將整個套接字服務器取下來。NodeJS - 子節點進程?

有沒有一種方法可以將兩者分開,如果連接的客戶端模塊腳本發生故障,它不一定會關閉整個服務器?

我假設這是子進程的用途,但文檔沒有提到啓動其他節點實例。

如果客戶端斷開連接,我顯然需要終止進程。

回答

5

我假設你正在談論的這些模塊是JS代碼。如果是這樣,你可能想嘗試vm module。這使您可以在單獨的上下文中運行代碼,並且還使您能夠圍繞執行特定代碼執行try/catch

您可以將節點作爲單獨的進程運行,並通過使用spawn來觀察數據,然後觀察stderr/stdout/exit事件以跟蹤任何進度。如果客戶端斷開連接,則可以使用kill來終止進程。你將不得不映射客戶端和產生的進程,儘管如此,他們的斷開事件將觸發正常關閉進程。

最後,​​事件可以用作任何錯過的異常的「全部捕獲」,從而使服務器不會完全死亡(當然信號有點例外)。

1

正如其他海報指出,你可以充分利用「虛擬機」模塊,但你也許可以從響應其餘告訴,這樣做增加了顯著的複雜性。

而且,從「虛擬機」 DOC:

 
Note that running untrusted code is a tricky business requiring great care. 
To prevent accidental global variable leakage, vm.runInNewContext is quite 
useful, but safely running untrusted code requires a separate process. 

雖然我敢肯定,你可以運行在一個子進程的新實例的NodeJS,這裏最好的做法是瞭解您的應用程序能夠而且將會失敗,然後進行防禦性編程以處理所有可能的錯誤狀況。

如果你的代碼的某些部分「走(S)關閉整個服務器...」,那麼你真的理解爲什麼出現這種情況和解決問題,而不是依賴於另一個進程的要求工作,保護你設計和建立生產品質的服務。