NodeJS - 子进程是什么?

5
我正在使用NodeJS运行一个套接字服务器(使用socket.io)。当客户端连接时,我想打开并运行一个模块来执行一些操作。尽管我很注意尝试捕获尽可能多的错误,但当此模块抛出错误时,它显然会将整个套接字服务器关闭。
有没有办法将两者分离,以便如果连接的客户端模块脚本失败,它不一定会导致整个服务器崩溃?
我认为这就是子进程的用途,但文档没有提到如何启动其他节点实例。
如果客户端断开连接,我显然需要杀死该进程。
2个回答

5
我假设你所说的模块是JS代码。如果是这样,你可以尝试使用vm模块。它可以让你在单独的上下文中运行代码,并且还可以让你在执行特定代码时进行try/catch操作。
你可以将node作为单独的进程运行,并使用spawn观看数据的传输,然后观察stderr/stdout/exit事件以跟踪任何进展。然后,如果客户端断开连接,kill可用于终止进程。但你需要映射客户端和生成的进程,以便它们的断开事件会正确地触发进程关闭。

最后未捕获异常事件可以用作“万能接收器”,以捕获任何被忽略的异常,这样服务器就不会完全崩溃(当然,信号是一个例外)。


1

正如另一位评论者所指出的,你可以利用 'vm' 模块,但是从响应的其余部分可以看出,这样做会增加显著的复杂性。

此外,从 'vm' 文档中可以看到:

请注意,运行不受信任的代码是一个需要极大谨慎的棘手问题。
为了防止意外的全局变量泄漏,vm.runInNewContext非常有用,但是安全地运行不受信任的代码需要单独的进程。

虽然我相信你可以在子进程中运行一个新的nodejs实例,但是最佳实践是理解你的应用程序可能出现的故障,并编写防御性代码来处理所有可能的错误条件。

如果你的代码中的某些部分“使整个...服务器崩溃”,那么你真的需要理解为什么会发生这种情况,并解决该问题,而不是依赖另一个进程来保护你免于设计和构建生产质量服务所需的工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接