优雅地退出node.js

我正在阅读优秀的在线书籍http://nodebeginner.org/并尝试简单的代码

var http = require("http"); function onRequest(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); 

现在我不知道(我还不知道!)如何优雅地closuresnode.js,所以我只是去ctrl+z 。 现在,每次我尝试运行node server.js我收到以下错误消息。

 node.js:134 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: EADDRINUSE, Address already in use at Server._doListen (net.js:1100:5) at net.js:1071:14 at Object.lookup (dns.js:153:45) at Server.listen (net.js:1065:20) at Object.<anonymous> (/Users/Bob/server.js:7:4) at Module._compile (module.js:402:26) at Object..js (module.js:408:10) at Module.load (module.js:334:31) at Function._load (module.js:293:12) at Array.<anonymous> (module.js:421:10) 

所以,有两个问题:

1)如何优雅地closuresnode.js?

2)我如何修复我创build的混乱?

  1. 使用Ctrl + C可以正常退出节点进程

  2. 清理混乱取决于你的平台,但基本上你需要find哪个节点正在运行的进程的剩余部分,并杀死它。

    例如,在Unix上: ps -ax | grep node ps -ax | grep node会给你一个条目,如:

     1039 ttys000 0:00.11 node index.js 

    其中index.js是您的节点文件的名称。

    在这个例子中,1039是进程ID(你的将是不同的),所以kill -9 1039将会结束它,你将能够再次绑定到端口。

我目前使用Node的事件系统来响应信号。 以下是我如何在程序中使用Ctrl-C(SIGINT)信号:

 process.on( 'SIGINT', function() { console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" ); // some other closing procedures go here process.exit( ); }) 

你得到了“使用中的地址”错误,因为Ctrl-Z没有杀死程序。 它只是暂停在一个类Unix操作系统的进程,你放在后台的节点程序仍绑定到该端口。

在类Unix系统上,[Control + Z]是挂起进程(SIGTSTP)的键序列中最常用的默认键盘映射。 当用户在他们的计算机terminalinput时,正在运行的前台进程发送一个SIGTSTP信号,这通常会导致进程暂停执行。 用户稍后可以通过键入命令'fg'(前景的简写)或键入'bg'(简称为背景),然后键入命令'disown'以从terminal分离后台进程来继续执行stream程。 1

您需要通过执行kill <pid>或'killall -9 node'等来杀死进程。

由于node.js是一个事件驱动的运行时,最优雅的退出是耗尽未决事件的队列。 当事件队列为空时,进程将结束。 您可以通过执行诸如清除所有设置的间隔定时器以及通过打开套接字连接来closures所有服务器来确保排除事件队列。 使用第三方模块时会变得更加棘手,因为您可能受到模块作者是否妥善地排除其创build的未决事件的束缚。 这可能不是退出node.js过程的最实际的方法,因为您将花费大量精力来追踪“泄漏”的未决事件,但这我认为最优雅的方式。

键入要么

 process.exit() 

要么

 .exit 

优雅地退出node

Ctrl + C两次将强制退出。

1)如何优雅地closuresnode.js?

收听SIGINT信号。 在Windows上,您需要使用readline模块来侦听ctrl-c。

我写了自己的解决scheme,为应用程序提供了一个正常的closures和使用域: 宽限期 。 值得一看。