2011-06-01 84 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)关闭整个服务器...”,那么你真的理解为什么出现这种情况和解决问题,而不是依赖于另一个进程的要求工作,保护你设计和建立生产品质的服务。