基本的Node.js示例不适用于Windows 7

时间:2011-12-18 18:47:04

标签: windows node.js windows-7

我从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不起作用。浏览器的请求超时。我也试过听(1337,' 0.0.0.0')并听(1337,' 127.0.0.1')。

我知道服务器正在运行;如果我按CTRL + C并停止节点,浏览器会立即返回ERR_CONNECTION_RESET。

我也试过在这个要点中运行代码,这不起作用:https://gist.github.com/1339846。我最终得到了控制台输出"倾听!"然后别的什么。

此外,我尝试了不同的端口,我的防火墙通过

关闭
netsh firewall set opmode mode=disable

我试过防火墙完全禁用,服务停止了。如果我使用netstat -noa检查连接,我可以看到node为浏览器打开了一堆连接,所有连接都处于CLOSE_WAIT状态。所以看起来连接正在发生,但是node.js还没有工作。

应该由请求启动的回调函数永远不会执行 - 我在各个区域撒了一些console.log语句,除了回调中的任何一个之外它们都执行。

我卸载,重新安装,尝试了几个以前的版本,重新启动了我的机器......没有。

感谢任何帮助!

更新:我刚刚放弃了。我已经尝试了所有我能想到的东西,并且最终在VirtualBox中的Ubuntu实例中运行node.js比在吸管时更容易。

6 个答案:

答案 0 :(得分:8)

!!!!!!同样的问题发生在我身上......

这是一个我还没有找到的解决方案:

查看Windows Firewall with Advanced Security并查看Evented I/O for V8 JavaScript是否被屏蔽或出现两次。

如果是,请取消阻止并删除重复的条目。如果安装/卸载/安装nodeJs,则会有2个条目。

当节点首次运行时,将打开“窗口防火墙”对话框,询问您是否允许节点具有防火墙访问权限。如果您按“否”或只是关闭窗口而不询问,它将创建Evented I/O for V8 JavaScript并且它将被阻止。

答案 1 :(得分:3)

我遇到了同样的问题,在阅读完文档后,我意外地遇到了我认为的解决方案。在我的实例中,我注意到传入的请求被传递到节点,但响应从未触发其“结束”事件。因此,在Windows中更改传入的防火墙规则似乎与问题无关。

因此,http.createServer接受一个参数 - 一个应该包含请求和响应参数的函数。请求参数似乎是问题所在。 request参数是http.incomingMessage的一个实例。这个类只有一个事件类型,但它本身也是Stream.Readable的一个实现,这是我发现未触发的'end'事件。真的没有其他原因只是为了测试哪个是第一个没有被触发的事件,我只是为另一种类型的事件添加了一个监听器('可读'),并且只添加了一个console.log行,这使得整个事情起作用。

所以代码看起来像这样:

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 :(得分:2)

我刚尝试过,它对我有用。确保您没有阻止防火墙的节点。

答案 3 :(得分:2)

  

我使用的是32位Windows 7。

您使用的是哪个版本的Windows 7?例如。家庭高级版,专业版,终极版?

npm github project上的一个帖子在使用npm安装nodejs模块时提到了类似的症状,而评论似乎将其缩小到由Windows 7 Professional引起的。它是32/64位似乎并不重要。

我遇到了您描述的问题以及npm安装问题,并且正在运行Windows 7 Professional 64位。

使用XPMode(npm线程中提到的解决方法)让我可以解决这两个问题。虽然,我想这只是你在VirtualBox中使用Ubuntu的Windows-y版本。

其他解决方法尝试没有成功:

  • 制作/运行v0.6.6
  • 的Debug版本
  • 制作/运行v0.6.5的调试版本(实际上在启动时崩溃)
  • 在已安装的node.exe上设置各种兼容模式
  • v0.6.5的预打包Windows安装程序

答案 4 :(得分:2)

  1. 转到“控制面板\所有控制面板项目\ Windows防火墙\允许” 程序“
  2. 点击允许程序
  3. 从列表中选择nodejs。
  4. 这解决了我的所有问题

答案 5 :(得分:1)

我遇到了与此代码相同的问题(来自此链接的Http Server示例: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的最新稳定版本(适用于windows或linux的v0.10.18)。希望这可以帮助任何人解决这个问题。