web-dev-qa-db-fra.com

Node.js connect ne fonctionne que sur localhost

J'ai écrit une petite application node.js, à l'aide de Connect, qui sert une page Web, puis lui envoie des mises à jour régulières. Il accepte et enregistre également les observations de l'utilisateur dans un fichier sur disque.

Cela fonctionne bien tant que je suis sur localhost, mais je ne parviens pas à voir d'autres opérateurs de communication sur le même intranet. J'utilise le port 3000, mais le passage au port 8080 ou 80 n'a pas aidé.

Voici le code que j'utilise pour configurer la connexion: 

    
var io = require('socket.io'),
  connect = require('connect');

var app = connect().use(connect.static('public')).listen(3000);
var chat_room = io.listen(app);

Comme indiqué ci-dessus, j'ai essayé de changer le numéro de port à 8080 ou à 80 et je n'ai pas constaté de différence. Je ne pense donc pas que c'est un problème de pare-feu (mais je peux me tromper). Après avoir lu des questions similaires sur HTTP, j'ai également pensé à ajouter 0.0.0.0 à listen (), mais il ne semble pas que listen () prenne un paramètre de masque IP.

37
schaz

Très probablement, votre socket de serveur est liée à l'adresse IP de bouclage 127.0.0.1 au lieu de l'adresse IP symbolique "toutes les adresses IP" 0.0.0.0 (notez qu'il ne s'agit PAS d'un masque de réseau). Pour confirmer cela, lancez Sudo netstat -ntlp (Si vous êtes sur Linux) ou netstat -an -f inet -p tcp | grep LISTEN (OSX) et vérifiez l'adresse IP de votre processus (recherchez la ligne avec ": 3000"). Si vous voyez "127.0.0.1", c'est le problème. Résoudre le problème en passant "0.0.0.0" à l'appel listen:

var app = connect().use(connect.static('public')).listen(3000, "0.0.0.0");
85
Peter Lyons

Pour que d’autres utilisateurs puissent accéder à votre ordinateur local, j’utilise généralement/ ngrok . Ngrok expose votre hôte local sur le Web et dispose d'un wrapper NPM simple à installer et à démarrer:

$ npm install ngrok -g
$ ngrok http 3000

Voir cet exemple d'utilisation:

 enter image description here

Dans l'exemple ci-dessus, l'instance locale de navigation sur: localhost: 3000 est maintenant disponible sur Internet et servie sur: http://69f8f0ee.ngrok.io ou https://69f8f0ee.ngrok.io

62
arcseldon

La liaison à 0.0.0.0 est la moitié de la bataille. Il existe un pare-feu ip (différent de celui des préférences système) qui bloque les ports TCP. Donc le port doit être débloqué là aussi en faisant:

Sudo ipfw add <PORT NUMBER> allow tcp from any to any
5
Ashish Kaila

J'ai une solution très simple à ce problème: process.argv vous donne une liste d'arguments passés à node app . Donc, si vous exécutez:

node server.js 0.0.0.0

Tu auras:

process.argv[0] //=> "node"
process.argv[1] //=> "server.js"
process.argv[2] //=> "0.0.0.0"

Donc, vous pouvez utiliser process.argv[2] pour spécifier cela comme adresse IP que vous voulez écouter:

http.listen(3000, process.argv[2]);

Désormais, votre application écoute "toutes" les adresses IP, par exemple http://192.168.1.4:3000/your_app .

J'espère que cela aidera quelqu'un!

3
akelec

Sur votre application, la rend accessible depuis n'importe quel appareil du réseau:

app.listen(3000, "0.0.0.0");

Pour NodeJS dans Azure, GCP et AWS

Pour Azure vm déployé dans le gestionnaire de ressources, vérifiez votre groupe de sécurité réseau virtuel et ouvrez des ports ou des plages de ports pour le rendre accessible, sinon dans vos points de terminaison de cloud, si vm est déployé dans une ancienne version d'Azure.

Il suffit de chercher l’équivalent pour GCP et AWS

3
ClusterAtlas

Fedora ou Centos distro vérifier votre selinux et firewalld dans mon cas firewalld a empêché la connexion:

 Selinux: $ sestatus 
 Statut SELinux: activé 
 Monture SELinuxfs: /sys/fs/selinux
SELinux répertoire racine: /etc/selinux
Nom de stratégie chargé: ciblé .__ Mode actuel : {{checkmode}} 
 Mode à partir du fichier de configuration: {{checkconfig}} 
 Statut de la stratégie MLS: activé 
 Statut de la stratégie deny_unknown: autorisé 
 Version de la stratégie du noyau maximale: 30 

 Statut de Firewalld: $ systemctl status firewalld 
1
soloproper

Travaillez pour moi avec cette ligne (ajoutez simplement --listen en cours d'exécution):

node server.js -p 3000 -a : --listen 192.168.1.100

J'espère que ça aide...

0
Meloman

Après avoir lutté pendant un certain temps avec ce problème, j’ai réussi à le résoudre en autorisant les connexions entrantes sur le port 8080.

Puisque vous avez écrit que la solution .listen(8080, "0.0.0.0") ne fonctionnait pas pour vous, assurez-vous que les connexions sur le port 8080 sont autorisées via votre pare-feu.

Ce message m'a aidé à créer une nouvelle règle entrante dans les paramètres du pare-feu Windows.

0
Bar Horing