5

次のように 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'、syscall: 'connect' }

ホストはinmyhost.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

編集:最も明白なものを含む、hostsファイルの事実上すべての順列を試しました:

127.0.0.1   localhost 
255.255.255.255 broadcasthost
::1             localhost myhost.local myhost
fe80::1%lo0 localhost

編集また、これを複数のMacで試したことにも言及する必要があります。

これはかなり一般的なエラーのようですが、役立つ説明や回避策は見当たりません。関連する注目すべき事実を次に示します。

  1. 実行$ wget http://myhost.local:8080は期待どおりに機能するため、ファイアウォールの問題ではありません。
  2. 実行$ telnet myhost.local 8080してから手動で URL を GET すると問題なく動作するため、奇妙な HTTP の問題ではありません。
  3. 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

ここで何が起こっているのか、そしてどのような修正が考えられるのか、誰にも分かりませんか?

4

3 に答える 3

12

他の誰かが問題を抱えている場合に備えて、これをここに投稿します。

Bert Belder、Node.jsメーリングリスト:

システムでは、「myhost.local」は3つの異なるアドレス(127.0.0.1、:: 1、およびfe80 :: 1)に解決されます。ノードはipv6よりもipv4を優先するため、127.0.0.1に接続しようとします。127.0.0.1:8080でリッスンしているものがないため、connect()システムコールはECONNREFUSEDで失敗します。ノードは、解決された他のIPで再試行せず、エラーを報告するだけです。簡単な解決策は、「localhost」を目的の宛先IPアドレス「::1」に置き換えることです。

この振る舞いが正しいかどうかは議論の余地がありますが、これが原因です。

バート

于 2013-03-06T10:33:47.933 に答える
0

これは機能しますか?

var http = require('http');
var options = {
  host: 'myhost.local',
  port: 8080,
  path: '/'
};

http.get(options, function (res) { 
  console.log("RES" + res) 
}).on('error', function (e) { 
  console.log("Error:", e) 
});
于 2013-03-05T15:13:17.310 に答える