2015-05-09 41 views
4

节点文件可以从服务器到简单的脚本描述,甚至一些只打印到控制台:为什么节点server.listen不返回到外壳

//logger.js 
console.log('Hello World'); 

// in the terminal 
> node logger.js 
Hello World 
> 

如何http包(及其他)不给命令提示给用户;他们如何保持这一进程的活力?当有事件队列中没有事件,没有后台任务存在

//server 
require('http').createServer(function (req, res) { 
    res.end('Hello World'); 
}).listen(3000); 

// in the terminal 
> node server.js 
// process stays in the foreground, no prompt back 
+0

从你对答案的评论中,你听起来像是想要建立一些行为如此的东西。一般来说,如果你仍然有某些事情正在进行(服务器侦听,setTimeout等等),这将自动发生。你在做什么,应该让这个过程保持活跃,但没有? –

+0

@AaronDufour它是相当于理解它是如何工作的;-) –

回答

6

如果有套接字在监听,节点将不会退出。这就是TL,DR的答案。 (其他的答案谈论事件队列是关于作为节目不能退出原因可能是正确的,但是这不是正在发生的事情与server.listen()

引擎盖下,http.createServer()是(最终)调用server.listen()呼叫由于server.listen()创建套接字,因此server.listen()将阻止该进程退出。注from the docs for socket.ref():UNREF的

对面,呼吁裁判在以前unrefd插座不会让程序退出,如果它是唯一剩下的插座(默认行为)。如果套接字被refd再次调用ref将不起作用。

而且socket.unref()

套接字上调用UNREF将允许程序退出,如果这是在事件系统中唯一活跃的插座。如果套接字已经是unrefd,再次调用unref将不起作用。

如果你想从那里进入下一级,我相信你需要潜入Node.js/io.js底层的C或C++。

4

节点将退出你的情况(可加事件事件队列),它是更高版本。

+0

那么最简单的方式来行动像http.createServer并保持手? –

+0

你是什么意思保持手? – user2786771

+0

在我的问题:让过程在前台,没有提示回 –

相关问题