来自node.js新手的一些问题
我刚刚开始学习node,正在Fedora 12上使用node-v0.4.11。它安装没有任何错误,我能够运行一些基本的程序,但有一些事情我不能弄清楚 如果我在一个端口上创建一个服务器,然后使用Ctrl+C停止节点 如果不重新启动服务器,我无法再次使用该端口启动服务器 系统 我的代码如下所示来自node.js新手的一些问题,node.js,Node.js,我刚刚开始学习node,正在Fedora 12上使用node-v0.4.11。它安装没有任何错误,我能够运行一些基本的程序,但有一些事情我不能弄清楚 如果我在一个端口上创建一个服务器,然后使用Ctrl+C停止节点 如果不重新启动服务器,我无法再次使用该端口启动服务器 系统 我的代码如下所示 var port=8080; var count=0; var http=require('http'); var server = http.createServer(function(req, res)
var port=8080;
var count=0;
var http=require('http');
var server = http.createServer(function(req, res) {
count++;
console.log('request no '+count+' received');
res.writeHead(200);
res.end('you are at port '+port);
});
server.listen(port);
console.log('server started at port '+port);
现在,当我保存文件并执行它时,服务器启动。但是,当我从shell停止服务器时,我无法在我之前启动的端口(在本例中为8080端口)再次启动服务器。这很糟糕,因为每次我必须更改该文件时,我也必须更改端口号。我可以停止此行为吗
编辑:
这是我在尝试再次在同一端口启动服务器时遇到的错误
Server started at 8080
node.js:203
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: listen EADDRINUSE
at errnoException (net_uv.js:557:11)
at Array.<anonymous> (net_uv.js:632:28)
at EventEmitter._tickCallback (node.js:195:26)
服务器在8080启动
node.js:203
抛出e;//process.nextTick错误,或第一次勾选时的“error”事件
^
错误:请使用侦听器
在errnoException(net_uv.js:557:11)
在阵列上。(net_uv.js:632:28)
在EventEmitter上调用(node.js:195:26)
在使用Ctrl+C
终止node
后,我看到了进程列表,发现node仍在运行。所以我杀死了它,并再次检查了进程列表,以确保它是死的,并且它是死的(我在进程列表中看不到它)。现在我再次尝试在同一端口启动服务器,但我得到了与上面相同的错误。一旦我停止服务器并从浏览器发出请求,请求将永远挂起(它将继续等待)
我的下一个问题是,在上面的示例中,当服务器启动时 第一个请求
count
增加了3次,我可以看到3次
控制台上的消息。这只是第一个请求,如果我提出的话
更多请求的计数只增加一次。怎么了
这个问题解决了
我的下一个问题是,如果我更改
res.writeHead(200)代码>到
res.writeHead(404)代码>或任何其他有效的状态代码,如300
节点
在命令行中给出错误,但这些是有效的状态代码和
服务器应该启动并根据
对于404
,找不到类似的状态代码。我做错了什么
这个问题解决了
我无法使用Firebug
的“Net”选项卡来监视请求
向节点创建的服务器发送请求。有没有办法做到这一点
谢谢你的支持
我无法在以前启动的端口再次启动服务器
你不应该看到这种行为,我无法复制它。当您再次尝试启动服务器时,是否收到错误消息?这是怎么一回事?停止服务器后,是否在进程列表中看到任何节点
进程?如果是这样,你能在杀死他们后启动你的服务器吗
count
增加3倍,我可以在控制台上看到3条消息
您的浏览器正在发送多个请求。例如,在Chrome中,您可能会收到(1)预取请求(Chrome在其中下载它认为需要的页面),(2)实际的页面请求,以及(3)对favicon.ico的请求;您的节点应用程序正在侦听所有请求,而不仅仅是对/
URL的请求。在初始请求之后,浏览器缓存favicon等,不需要再次请求它们
尝试添加console.log(请求url)
到您的回调并查看浏览器要求的URL
任何其他有效的状态代码,如300
节点,都会在命令行中显示错误
我无法重现这个问题。你收到了什么错误
当我向节点创建的服务器发送请求时,我无法使用Firebug的“Net”选项卡监视请求
我也不能复制这个。Firebug和其他客户端调试工具不知道或不关心服务器上运行的是什么技术;它只会说HTTP。奇怪。。。我输入了完全相同的代码,没有任何问题。。。这就是正在运行的一切吗?但是当我从shell终止节点时,我无法在我之前启动的端口再次启动服务器
您是如何做到的?您应该尝试重新启动并在8080上重试;)@这就是我必须要做的,我不明白为什么。我正在从shell终止节点进程,这应该会释放端口。如果不行,我可以在不重新启动的情况下释放该端口吗?你确定你使用的是ctrl-c而不是ctrl-z吗?@david我使用的是ctrl-z。我真蠢。使用Ctrl-C
可以解决所有问题。向所有浪费时间的人道歉谢谢你的回答。我已经编辑了我的问题,以包含我第一个问题的错误。我检查了为什么计数增加了3倍,我发现Firefox
向favicon.icon
发送了2个请求,我认为这是因为当它第一次发出请求时,它没有得到图标,所以再次尝试。但是我没有得到你为chrome所说的预取的东西。为什么浏览器会猜测我想要什么?是的,甚至我都不明白为什么firebug不能捕获对节点的请求。毕竟它们都是http请求。顺便说一句,你可能指的是favicon.ico
而不是.icon
:)Chrome有一个新的ish功能,在你开始键入URL后,它会在你按下enter键之前下载页面。这只是又一次试图让事情“更快”的尝试。@Tom真的!手指比大脑快。:)谢谢