NodeJS - 子节点进程?

时间:2011-06-01 19:40:22

标签: node.js

我正在使用NodeJS来运行套接字服务器(使用socket.io)。当客户端连接时,我希望打开并运行一个可以完成大量工作的模块。尽管我小心翼翼地尝试尽可能多地捕获,但是当这个模块抛出错误时,它显然会使用它来取消整个套接字服务器。

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

我假设这是子进程的用途,但是文档没有提到启动其他节点实例。

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

2 个答案:

答案 0 :(得分:5)

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

您可以将节点作为单独的进程运行,并使用spawn观察数据,然后观察stderr / stdout / exit事件以跟踪任何进度。如果客户端断开连接,则kill可用于终止进程。您将不得不映射客户端和生成的进程,因此它们的断开连接事件将触发该进程正常关闭。

最后,uncaughtException事件可以用作任何错过的异常的“全能”,使得服务器不会被完全杀死(当然信号有点例外)。

答案 1 :(得分:1)

正如另一张海报所指出的那样,你可以利用'vm'模块,但是你可以从其余的响应中分辨出来,这样做会增加很多复杂性。

另外,来自'vm'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实例,但最好的做法是了解你的应用程序可以和将要失败的位置,然后进行防御性编程以处理所有可能的错误情况。

如果您的代码的某些部分“占用整个...服务器”,那么您真的要理解为什么会发生这种情况并解决该问题,而不是依靠其他流程来保护您免受设计所需的工作并建立一个生产质量的服务。