很多回答已经写的很全,补充(强调)一点——Node.js 中的容错性实在是很弱。当异步回调中出现异常,而相应的 error 的事件有没有被订阅(有时候根本不可能去订阅),那么整个进程都会挂掉。但尴尬的是,这个问题处理起来还特别难,这并不仅仅是一个 error 订阅的问题。早期的时候 Node.js 中提出了 Domain 机制,用于隔离错误域,希望解决这个问题。但是由于很多原因(特别是下层实现机制方面的问题),导致这套机制无法像预期的那样完美运作,程序该挂还得挂。
虽然有些人总是非常自信的认为自己写的代码肯定没问题,但不可否认的是目前 Node.js 程序大量使用各种第三方框架/模块,加上自己的部分,长期运行中没人敢拍胸脯保证程序不挂掉。所以 forever/pm2 之类是 Node.js 生产环境中必备的工具,用于自动重启进程。
虽然目前来看这些组合拳之下,Node.js 还是基本够用,但是对于服务端应用来说,可靠性是很重要的,所以 Node.js 社区必须在未来提出一个好的解决方案,否则将会制约其发展。
Domain 机制目前已经被 Node.js 社区标记为“弃用”,但新的替代方案还未完全就绪。我认为如果想要为 Node.js 社区做贡献,这会是非常核心的一个目标领域。