2016-12-14 54 views
1

Node.js程序在事件循環爲空時終止。如果我使用http模塊,沒有任何回調創建一個服務器被添加到事件循環,程序終止:`server.listen()`如何保持節點程序運行

const http = require('http'); 
const server = http.createServer(); 

但是,如果我添加listen,程序繼續運行:

const http = require('http'); 
const server = http.createServer(); 
server.listen(5155); 

那麼listen方法如何讓程序繼續運行,即使我沒有向事件循環添加任何東西?它是否增加了一些事件循環?它如何與它進行交互?這裏

+0

https://github.com/nodejs/node/blob/master/lib/net.js#L1337? – zerkms

+0

請參閱:http://stackoverflow.com/questions/7698834/how-does-a-node-js-process-know-when-to-stop/7699579#7699579 – Paulpro

+0

@zerkms,Paulpro謝謝,我會探討 –

回答

1

兩件事情:

如果你看一下關於server.listen(...)Node.js的文檔,它說在第一行:

開始對接受連接指定端口和主機名...

和:

此功能是異步的。當服務器已被綁定, '聆聽'事件將被髮射...

這本身是不足以回答你的問題。所以讓我們來看看代碼。

listen()方法(https://github.com/nodejs/node/blob/master/lib/net.js#L1292) 結束呼叫self._listen2()方法。還有在最後一行:

process.nextTick(emitListeningNT, this); 

https://github.com/nodejs/node/blob/master/lib/net.js#L1276

至極是回調到:

function emitListeningNT(self) { 
    // ensure handle hasn't closed 
    if (self._handle) 
    self.emit('listening'); 
} 

https://github.com/nodejs/node/blob/master/lib/net.js#L1285)。

這樣,除非node.js檢測到錯誤或其他停止條件,否則它將繼續運行。