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.
Ответы
Ответ 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