web-dev-qa-db-fra.com

Erreur ECONNREFUSED avec node.js qui ne se produit pas dans d'autres clients

Je fais une demande http avec le client node.js et j'obtiens une erreur ECONNREFUSED. Lorsque je fais ce qui semble être la même demande avec mon navigateur ou curl(1), cela fonctionne très bien

Voici la demande de noeud:

var options = {
  Host: 'localhost',
  port: 8080,
  path: '/explorers/1.0/agegroup',
  method: 'GET'
};

var req = http.request(options, function(res) {
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.on('error', function(e) {
  console.log(e);
});

req.end();

Et ça me donne l'erreur:

{ [Error: connect ECONNREFUSED]
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect' }

Mais quand je fais la même demande avec un client différent (curl dans ce cas):

$ curl http://localhost:8080/explorers/1.0/agegroup
{... response JSON ...}

Autres notes:

  • J'ai essayé de changer l'hôte en www.google.com et le port en 80, et le noeud établit la connexion avec succès.

  • J'ai essayé de changer le port du serveur, et je peux toujours faire des requêtes avec tous les clients sauf node.js (qui a toujours ECONNREFUSED)

  • Le serveur auquel je me connecte est le serveur WSGI CherryPy . Lorsque j'essaie de me connecter à un serveur node sur localhost: 8080, cela fonctionne bien, ce qui me laisse penser que c'est le problème du serveur, à l'exception que d'autres clients fonctionnent avec le serveur CherryPy.

  • J'ai essayé d'utiliser les mêmes en-têtes que ceux utilisés par mon navigateur, mais cela ne fonctionne pas et il semble que le problème se situe de toute façon au niveau TCP. Par conséquent, les en-têtes HTTP ne devraient pas être un problème.

Quel est le problème avec ma demande node?

22
aaronstacy

Je suppose que parfois vous avez juste besoin de vous éloigner du problème ...

J'ai trouvé une solution, mais elle ne semble pas répondre à la question et je ne l'aime pas vraiment.

J'ai modifié la configuration du serveur CherryPy pour qu'elle fonctionne à 127.0.0.1 au lieu de localhost et le client node a commencé à fonctionner.

12
aaronstacy

Je ne suis pas d'accord avec le désaccord de Soman. 

Je me suis tiré la tête, mais oui, il est suffisant que les serveurs nodejs v0.10.24 et v0.10.25 refusent de se connecter à un serveur de développement PHP 5.4 (serveur de ligne de commande de PHP) lorsqu'ils sont appelés en tant que:

php -S localhost:8088

Le navigateur, curl, tout le reste se connecte très bien. Cependant, bien sûr, changer l'adresse de la liaison pour être:

php -S 127.0.0.1:8088 

Et nodejs utilisant xmlrpc se connecte parfaitement. Cela s'est produit sous Mac OS X 10.9.1. Très étrange.

16
Steveorevo

Je viens de faire face au même problème.

Notez que Windows 7 par défaut n'inclut pas d'entrée pour localhost dans C:\Windows\System32\drivers\etc\hosts ( référence wikipedia )

L'ajout de l'entrée pour localhost n'a aucun effet avec Node.js (0.10.25) car il ignore apparemment le fichier hosts.

Utilisez 127.0.0.1 comme adresse locale à la place, cela fonctionnera comme jamais dans votre fichier hosts.

6
Txangel

J'ai eu le même problème. J'ai pu résoudre le problème en remplaçant localhost ou 127.0.0.1 par l'adresse IP de mon système (utilisez ifconfig pour l'adresse IP).

2
myst552

J'ai exactement fait face au même problème où j'accédais à une URL tierce. J'ai essayé d'utiliser dns (subdomain.domain.com) et ip (XXX.XXX.XXX.XXX), mais cela n'a pas fonctionné.

Après quelques difficultés, je me suis rendu compte plus tard que c’était un problème sur le serveur (subdomain.domain.com) qui n’était pas réactif et s’est éteint.

Je ne suis pas d'accord, c'est un problème avec localhost/127.0.0.1 (ou un nom de domaine contre une adresse IP). (Dans le cas ci-dessus, c'est sûrement un cas de mappage incorrect de l'hôte)

0
Soman Dubey