【发布时间】:2013-03-05 15:06:55
【问题描述】:
我运行node.js如下:
> http = require('http')
> http.get('http://myhost.local:8080',
function (res) { console.log("RES" + res) }
).on('error', function (e) { console.log("Error:", e) })
> uri = require('url').parse("http://myhost.local:8080")
{ protocol: 'http:',
slashes: true,
auth: null,
host: 'myhost.local:8080',
port: '8080',
hostname: 'myhost.local',
hash: null,
search: null,
query: null,
pathname: '/',
path: '/',
href: 'http://myhost.local:8080/' }
> http.get(uri,
function (res) { console.log("RES" + res) }
).on('error', function (e) { console.log("Error:", e) })
隐式和显式解析的 URI 均引发错误,我得到以下输出:
错误:{ [错误:连接 ECONNREFUSED] 代码:'ECONNREFUSED', 错误号:'ECONNREFUSED', 系统调用:“连接”}
主机myhost.local是localhost在/etc/hosts中的别名,是:
127.0.0.1 localhost myhost.local myhost
255.255.255.255 broadcasthost
::1 localhost myhost.local myhost
fe80::1%lo0 localhost myhost.local myhost
编辑:我几乎尝试了主机文件的所有排列,包括最明显的:
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost myhost.local myhost
fe80::1%lo0 localhost
编辑我还应该提到,我现在已经在不止一台 Mac 上尝试过这个。
虽然这似乎是一个相当常见的错误,但我没有看到任何有用的解释或解决方法。以下是一些值得注意的相关事实:
- 运行
$ wget http://myhost.local:8080可以正常工作,所以这不是防火墙问题。 - 运行
$ telnet myhost.local 8080然后手动获取 url 工作正常,所以这不是一个奇怪的 HTTP 问题。 - 我使用 node.js 连接到其他主机没有问题,例如http://www.google.com
我希望有用的系统信息包括:
$ node -v
v0.9.11
$ uname -a
Darwin myhost.local 12.2.1 Darwin Kernel Version 12.2.1:
Thu Oct 18 12:13:47 PDT 2012; root:xnu-2050.20.9~1/RELEASE_X86_64 x86_64
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.8.2
BuildVersion: 12C3104
$ sudo netstat -nalt | grep LISTEN | grep 8080
tcp6 0 0 ::1.8080 *.* LISTEN
有没有人知道这里发生了什么,可能有什么修复方法?
【问题讨论】:
-
如果你使用
localhost而不是myhost.local,你会得到同样的错误吗? -
是否有东西在 localhost:80 上运行?
-
@JohnnyHK, @Floby: 连接的应用是Google App Engine,绑定到
myhost。不过,让我发布我的netstat输出 - 它可能很有启发性 -
我在想 get 方法没有正确解析端口部分,而是连接到其他东西。试试下面的回答。
-
根据您的
netstat,您的 8080 服务绑定到 IPv6 本地主机,而不是 IPv4 本地主机。这可能是问题所在。
标签: node.js ipv6 node.js-connect