我正在阅读优秀的在线图书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);
现在我不知道(我仍然不知道!)如何优雅地关闭node.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)如何正常关闭node.js?
2)如何修复我创造的混乱?
答案 0 :(得分:123)
我目前使用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)。[3] 当用户在其计算机终端输入时,当前 运行前台进程一般是发送SIGTSTP信号 导致进程暂停执行。用户可以稍后 通过输入命令'fg'继续执行流程(简称for 前景)或键入'bg'(背景的缩写)以及此外 键入命令'disown'以分隔后台进程 终端。1
您需要通过执行kill <pid>
或“killall -9节点”等来终止您的流程。
答案 1 :(得分:52)
使用 Ctrl + C 正常退出节点进程
清理混乱取决于您的平台,但基本上您需要找到节点运行的进程的剩余部分并将其终止。
例如,在Unix上:ps -ax | grep node
将为您提供如下条目:
1039 ttys000 0:00.11 node index.js
其中index.js
是节点文件的名称。
在这个例子中,1039是进程ID(你的将是不同的),所以kill -9 1039
将结束它,你将能够再次绑定到端口。
答案 2 :(得分:20)
由于node.js是一个事件驱动的运行时,最优雅的退出是耗尽挂起事件的队列。当事件队列为空时,该过程将结束。您可以通过执行诸如清除所设置的任何间隔计时器以及关闭具有打开套接字连接的任何服务器等操作来确保事件队列耗尽。在使用第三方模块时会变得更加棘手,因为您无论模块作者是否已经注意优雅地消耗它创建的待处理事件,您都会受到怜悯。这可能不是退出node.js进程的最实用方式,因为您将花费大量精力来追踪“泄露”的待处理事件,但 最多我觉得很优雅。
答案 3 :(得分:7)
输入
process.exit()
或
.exit
优雅地退出node
。
按两次 Control + C 会强行退出。
答案 4 :(得分:0)
1)如何正常关闭node.js?
收听SIGINT信号。在Windows上,您需要使用readline模块监听ctrl-c。
我已经编写了自己的解决方案,以便为应用程序提供正常关闭和域名的使用:grace。值得一看。