Подтвердить что ты не робот

Node.js connect работает только на localhost

Я написал небольшое приложение node.js, используя Connect, который обслуживает веб-страницу, а затем отправляет регулярные обновления. Он также принимает и регистрирует наблюдения пользователей в файле диска.

Он отлично работает, пока я нахожусь на локальном хосте, но я не могу заставить других компьютеров в одной и той же интрасети увидеть его. Я использую порт 3000, но переход на порт 8080 или 80 не помог.

Вот код, который я использую для настройки соединения:

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

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

Как указано выше, я попытался изменить номер порта на 8080 или на 80, и не видел никакой разницы, поэтому я не думаю, что это проблема брандмауэра (но я могу ошибаться). Я также подумал о том, что после чтения подобных вопросов, касающихся HTTP, добавить 0.0.0.0 в listen(), но не кажется, что listen() принимает параметр маски IP.

4b9b3361

Ответ 1

Скорее всего, ваш серверный сокет привязан к IP-адресу loopback 127.0.0.1 вместо "всех IP-адресов" символического IP 0.0.0.0 (обратите внимание, что это НЕ маске сети). Чтобы подтвердить это, запустите sudo netstat -ntlp (если вы работаете в Linux) или netstat -an -f inet -p tcp | grep LISTEN (OSX) и проверьте, к какому IP связан ваш процесс (найдите строку с ": 3000" ). Если вы видите "127.0.0.1", эта проблема. Исправьте его, передав "0.0.0.0" на вызов listen:

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

Ответ 2

Чтобы получить доступ для других пользователей к вашему локальному компьютеру, я обычно использую ngrok. Ngrok предоставляет ваш локальный хост в Интернете и имеет обертку NPM, которая проста в установке и запуске:

$ npm install ngrok -g
$ ngrok http 3000

Смотрите пример использования:

введите описание изображения здесь

В приведенном выше примере локально исполняемый экземпляр парусов по адресу: localhost: 3000 теперь доступен в Интернете: http://69f8f0ee.ngrok.io или https://69f8f0ee.ngrok.io

Ответ 3

Привязка к 0.0.0.0 - это половина битвы. Существует IP-брандмауэр (отличный от того, который установлен в системных настройках), который блокирует TCP-порты. Следовательно, порт также должен быть разблокирован, сделав:

sudo ipfw add разрешить tcp от любого к любому

Ответ 4

У меня очень простое решение для этой проблемы: process.argv предоставляет вам список аргументов, переданных в приложение node. Поэтому, если вы запустите:

node server.js 0.0.0.0

Вы получите:

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

Итак, вы можете использовать process.argv[2], чтобы указать, что в качестве IP-адреса вы хотите прослушать:

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

Теперь ваше приложение прослушивает "все" IP-адреса, например:

http://192.168.1.4:3000/your_app

Я надеюсь, что это поможет кому-то!

Ответ 5

В вашем приложении он доступен с любого устройства в сети:

app.listen(3000, "0.0.0.0");

Для NodeJS в Azure, GCP и AWS

Для Azure vm, развернутого в диспетчере ресурсов, проверьте свою группу безопасности виртуальной сети и откройте порты или диапазоны портов, чтобы сделать ее доступной, в противном случае в конечных точках вашего облака, если vm развернут в старой версии лазурного.

Просто найдите эквивалент для GCP и AWS

Ответ 6

Работаю для меня с этой строкой (просто добавьте - слушать):

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

Надеюсь, что это поможет...

Ответ 7

Fedora или Centos проверьте, что ваш selinux и firewalld в моем случае firewalld предотвратили соединение:

Selinux: $sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   {{checkmode}}
Mode from config file:          {{checkconfig}}
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      30

Firewalld status: $systemctl status firewalld