首页 文章

NodeJS - 子节点进程?

提问于
浏览
5

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

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

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

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

2 回答

  • 5

    我'm assuming these modules you'谈论的是JS代码 . 如果是这样,您可能想尝试vm module . 这使您可以在单独的上下文中运行代码,还可以在执行特定代码时执行 try / catch .

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

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

  • 1

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

    另外,来自'vm'文档:

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

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

相关问题