基础的Node.js示例在Windows 7上无法正常工作

8
我从http://nodejs.org/#download下载了Node.js v0.6.6,并且使用的是32位的Windows 7操作系统。
我已经阅读了各种在线教程并想要进行实验,但好像无论如何都不能让Node.js工作。尽管Node能够运行我的.js文件,但是浏览器发起的任何请求都超时了。
这是一个典型的Hello World示例,但它不能正常工作:
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337);

当我在浏览器中输入127.0.0.1:1337或localhost:1337时,无法访问。浏览器请求超时。我还尝试过listen(1337,'0.0.0.0')和listen(1337,'127.0.0.1')。
我知道服务器正在运行;如果我按CTRL+C停止node,浏览器会立即显示ERR_CONNECTION_RESET。
我还尝试了在此代码片段中运行的代码,但它不起作用:https://gist.github.com/1339846。控制台输出“Listening!”,然后什么都没有发生。
此外,我尝试了不同的端口,并且我的防火墙已关闭。
netsh firewall set opmode mode=disable

我尝试完全禁用防火墙,但服务停止了。如果我使用netstat -noa检查连接,我可以看到node.js打开了一堆与浏览器的连接,所有连接都处于CLOSE_WAIT状态。所以看起来连接是在发生,但node.js没有工作。
回调函数应该由请求启动,但从未执行过——我在各个区域中添加了一些console.log语句,除了回调函数中的任何语句都会执行。
我已卸载、重新安装、尝试了几个以前的版本,重新启动了我的机器……没有什么效果。
感谢任何帮助!
更新:我几乎放弃了。我尝试了我所能想到的一切,最终在VirtualBox的Ubuntu实例中运行node.js比去抓稻草更容易。

1
将端口更改为8000或8080,然后再试一次。让我知道结果如何。 - alessioalex
我已经尝试了那些端口和其他端口。 - CircusNinja
@alessioalex - 我也是这么想的。我甚至尝试了完全禁用防火墙,并停止服务。如果我使用netstat -noa检查连接,我可以看到节点为浏览器打开了一堆处于CLOSE_WAIT状态的连接。所以看起来连接正在发生,但node.js却无法工作。也许我会尝试重新安装。 - CircusNinja
尝试了新的安装,还尝试了回退版本,但仍然无法使用nodejs。 - CircusNinja
你尝试以管理员身份运行托管节点和浏览器的CMD窗口了吗?还要检查一下你的hosts文件是否干扰了该端口。最后,尝试编写一个简单的应用程序(Web请求)连接到该IP和端口,看看它是否正常工作。很抱歉你遇到这么多麻烦。 - AboutDev
显示剩余2条评论
6个回答

8

!!!!!! 我也遇到了同样的问题....

以下是我找到的解决方法,其他地方都没有提到过:

Windows高级防火墙 中查看是否阻止了 Evented I/O for V8 JavaScript 或者出现了两次。如果是,请取消阻止并删除重复的条目。如果你安装/卸载/重新安装 nodeJs,则会有两个条目。

此外,当 node 第一次运行时,Windows 防火墙对话框会打开询问是否允许 node 访问防火墙。如果按下“否”或只是关闭窗口而不询问,它将创建 Evented I/O for V8 JavaScript 并且它将被阻止。


我的里面有两个条目,都是允许的。删除了一个,但仍然没有成功 :( - Navin Nagpal
尝试禁用防火墙并检查。 - Brian McGinity
@Navin 我也遇到了同样的问题,即使我删除了重复的条目,但是用户名密码弹出框仍然没有出现。请问如何让它再次出现?请帮忙。 - Vishnu Sureshkumar
@Navin - 请帮忙。我已经尝试了很多选项,比如重新安装node js,当我第一次运行node app.js时,弹出窗口出现了,但是它再也没有出现过。 - Vishnu Sureshkumar

3
我遇到了同样的问题,在阅读文档后,我意外地发现了我认为是解决方案的方法。在我的情况下,我注意到传入请求确实已经被发送到节点,但是响应却从未触发其“end”事件。因此,在 Windows 中更改传入防火墙规则似乎与该问题无关。
因此,http.createServer接受一个参数——一个应包含请求和响应参数的函数。问题似乎出现在请求参数上。请求参数是http.incomingMessage的一个实例。这个类只有一种事件类型,但它本身也是Stream.Readable的一种实现,而这正是我找到的没有被触发的“end”事件所在的地方。实际上,只是为了测试第一个未触发的事件是哪个,我添加了另一种类型的事件(“readable”)的监听器,然后仅添加了一个控制台日志行就使整个过程工作了。
因此,代码看起来简单得像这样:
var http = require("http");
http.createServer(function (request, response) {
    console.log('request');
    request.on('readable', function(){
        console.log('request readable');
    });
    request.on("end", function () {
        console.log('request end');
        response.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        response.end('Hello HTTP!');
    });
}).listen(8080);

上述代码是有效的,而下面没有“可读”事件监听器的早期版本永远不会响应:
var http = require("http");
http.createServer(function (request, response) {
    console.log('request');
    request.on("end", function () {
        console.log('request end');
        response.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        response.end('Hello HTTP!');
    });
}).listen(8080);

我不确定为什么这样做有效,除了文档中的一点提示:

在某些情况下,监听“可读”事件将导致从底层系统读取一些数据进入内部缓冲区,如果尚未读取。


2

我刚刚尝试了一下,对我有效。请确保您的防火墙没有阻止节点。


1
禁用了防火墙,但它仍然不合作。 - CircusNinja

2
  1. 进入 "控制面板\所有控制面板项\Windows防火墙\允许的程序"
  2. 点击"允许的程序"
  3. 从列表中选择nodejs。

这样我就解决了所有问题。


2
我正在使用32位的Windows 7。
你使用的是哪个版本的Windows 7?例如:家庭高级版,专业版,终极版? npm github project 上的一个帖子提到了使用npm安装nodejs模块时出现类似症状的情况,并且评论似乎将其归因于Windows 7 Professional。它是32位/64位好像并不重要。
我遇到了你描述的问题和npm安装问题,并且正在运行64位的Windows 7 Professional。
使用XPMode(npm线程中提到的一种解决方法)使我解决了这两个问题。虽然,我想这只是你在VirtualBox中使用Ubuntu的更Windows友好的版本。
尝试过但没有成功的其他解决方法:
  • 制作/运行 v0.6.6 的调试版本
  • 制作/运行 v0.6.5 的调试版本(实际上在启动时崩溃了)
  • 在已安装的 node.exe 上设置各种兼容模式
  • v0.6.5 的预打包 Windows 安装程序

我正在使用Ultimate。感谢您提供的问题提示;有趣的是看看它是否相关。 - CircusNinja

1

我遇到了与这个代码相同的问题(来自这个链接的Http服务器示例:http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/

var http = require("http");
http.createServer(function (request, response) {
    request.on("end", function () {
        response.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        response.end('Hello HTTP!');
    });
}).listen(8080);

我尝试了Windows 7的64位版本、Windows XP虚拟机、Ubuntu虚拟机……都不行!只有在我注释掉"request.on"这一行之后才起作用。你的示例(没有这一行)对我来说运行良好。我正在使用来自node.js的最新稳定版本(v0.10.18,适用于Windows或Linux)。希望这对任何遇到问题的人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接