NodeJS – 子节点进程?

我正在使用NodeJS运行套接字服务器(使用socket.io)。 当一个客户端连接时,我想打开并运行一个模块,它会做一堆东西。 即使我尽可能地尝试捕获,当这个模块抛出一个错误时,它显然会把整个套接字服务器取下来。

有没有办法我可以分开这两个,所以如果连接的客户端模块脚本失败,它不一定会砍掉整个服务器?

我假设这是subprocess的目的,但文档没有提到启动其他节点实例。

如果客户端断开连接,我显然需要终止进程。

我假设你正在谈论的这些模块是JS代码。 如果是这样,你可能想尝试VM模块 。 这使您可以在单独的上下文中运行代码,并且还使您能够执行特定代码的执行try / catch

您可以将节点作为单独的进程运行,并使用spawn观察数据,然后观察stderr / stdout / exit事件以跟踪任何进度。 然后kill可以用来杀死进程,如果客户端断开连接。 你将不得不映射客户端和产生的进程,尽pipe如此,他们的断开事件将触发正确closures进程。

最后, uncaughtException事件可以被用作任何遗漏的exception的“全部捕获”,使得服务器不会完全死亡(当然,信号是一个例外)。

正如另一张海报所提到的那样,你可以利用“虚拟现实”模块,但正如你从剩下的反应中可以看出的那样,这样做会增加复杂性。

另外,从'vm'文档:

请注意,运行不受信任的代码是一项棘手的业务,需要非常小心。 
为了防止意外的全局variables泄漏,vm.runInNewContext相当 
有用,但安全运行不受信任的代码需要一个单独的进程。

虽然我确定可以在subprocess中运行一个新的nodejs实例,但最好的做法是了解应用程序可以发生故障的位置,然后进行防御性编程,以处理所有可能的错误情况。

如果你的代码的某些部分“取下了整个服务器”,那么你真的要明白为什么会发生这种情况并解决这个问题,而不是依靠另一个进程来阻止你从devise和构build生产优质服务。