什么时候Nodejs进程退出?

一个简单的节点程序在运行完所有的代码后立即退出:

console.log('hello'); 

但是,执行所有代码后,侦听端口的http服务器程序不会退出:

 var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); 

所以我的问题是,是什么造成了这种差异? 是什么让第一个程序在执行所有代码后退出,而第二个程序继续存在?

我在Java中理解,规范说当最后一个非守护线程退出时,JVM退出。 那么,nodejs世界里的机制是什么?

[…]是什么造成这种差异? 是什么让第一个程序在执行所有代码后退出,而第二个程序继续存在?

第二节目.listen()编辑。

节点的机制是事件循环 , node进程通常会在下列情况下退出:

  • 事件循环的队列是空的。
  • 没有后台/asynchronous任务仍然能够添加到队列中。

.listen()build立一个永久性的任务,无限期地添加到队列中。 也就是说,直到.close() d或进程终止。

延长第一个应用程序的简单例子是添加一个计时器 :

 setTimeout(function () { console.log('hello'); }, 10000); 

对于该应用程序的大部分运行时,事件队列将为空。 但是,计时器将以后台/asynchronous方式运行,等待10秒后再将callback添加到队列中,以便可以logging'hello' 。 之后,随着计时器完成,两个条件都得到满足,并且过程退出。

更多的评论不是一个答案,但它与监听服务器进程无关。 正如Jonathan Lonowski所说,它基于事件循环。 例如,这是吉姆·威尔逊的Node.js正确的方法 :

 // watcher.js - watches a text file for changes. const fs = require('fs'); fs.watch('target.txt', function() { console.log("Target.txt just changed!"); }); console.log("Watching target.txt"); 

它调用node --harmony watcher.js

它不会退出; 它需要一个CTRL + C。

Node.js跟踪活动事件监听器 。 只要没有活动事件监听器,Node.js程序就会终止。

Hello world程序不会启动任何事件侦听器,因此在源代码执行后终止。

HTTP服务器程序的行为有所不同。 它创build一个服务器并将其绑定到一个端口。 通过这样做,只要build立了新的HTTP连接,就会注册一个处理程序。 当到达程序代码的末尾时,有一个活动的事件监听器出现,程序继续运行。

你可以通过在一段时间后发出server.close()来终止服务器程序。