Приложение Node.js / Express.js работает только на порту 3000

97

У меня на сервере работает приложение Node.js / Express.js, которое работает только на порте 3000, и я пытаюсь понять, почему. Вот что я нашел:

  • Без указания порта ( app.listen()) приложение запускается, но веб-страница не загружается.
  • На порте 3001 ( app.listen(3001)) или любом другом неиспользуемом порту приложение запускается, но веб-страница не загружается.
  • На порте 2999 приложение выдает ошибку, потому что что-то другое использует этот порт.
  • На порту 3000 приложение запускается и веб-страница загружается нормально.

Я знаю, что приложения Express по умолчанию используют порт 3000. Но, как ни странно, мое приложение запускается только тогда, когда я явно заставляю его работать на порту 3000 ( app.listen(3000)).

Я нашел это в строке 220 /usr/bin/express:

app.set(\'port\', process.env.PORT || 3000);

Что делает, как указано ранее: установка порта на то, что указано, или на 3000, если ничего не указано.

Как я могу заставить мое приложение работать на другом порту, например 8080 или 3001?

Спасибо!

Изменить: образец кода (очень простое приложение Node / Express)

var express = require("express");
var app = express();

app.get('/', function(req, res){
    res.send('hello world'); 
});

// Only works on 3000 regardless of what I set environment port to or how I set [value] in app.set('port', [value]).
app.listen(3000);
Бенджамин Мартин
источник
1) portтребуется .listen(), так что вы не должны пытаться идти без. 2) Возникают ли ошибки при запуске приложения? Или это просто кажется недоступным из браузера? 3) Вы пытаетесь получить доступ к веб - сайт на одной машине с localhost:3000, localhost:3001и т.д.? Если вы используете две машины, один клиент и один сервер, вам необходимо добавить исключения в брандмауэр на сервере, чтобы разрешить Node получать запросы от клиента.
Джонатан Лоновски
Как вы запускаете приложение?
deitch 02
Есть ли шанс, что вы сможете вкратце изложить очищенную / продезинфицированную версию?
deitch 02
@ Джонатан Полезно знать .listen(). Выше, когда я говорю «приложение запускается», это то же самое, что вы говорите «без ошибок при запуске приложения». Когда я говорю «веб-страница не загружается», это то же самое, что вы говорите «недоступна из браузера». Весь доступ с одной машины (моего сервера). Спасибо за ответ.
Бенджамин Мартин
1
@deitch, который я использую, $ supervisor app.jsили $ PORT=[PORT] node app.jsкогда хочу установить переменную порта среды. Я выложу образец кода.
Бенджамин Мартин

Ответы:

118

Следующее работает, если у вас есть что-то подобное в вашем app.js:

http.createServer(app).listen(app.get('port'),
  function(){
    console.log("Express server listening on port " + app.get('port'));
});

Либо явно закодируйте свой код, чтобы использовать нужный порт, например:

app.set('port', process.env.PORT || 3000);

Этот код означает, что для вашего порта нужно указать переменную окружения PORTили, если она, undefinedто установить его в литерал 3000.

Или используйте свою среду для установки порта. Настройка его с помощью среды используется , чтобы помочь разграничить между PRODUCTIONи , DEVELOPMENTа также множеством платформ , как служба использовать окружающую среду для установки порта в соответствии с их спецификациями, а также внутренней конфигой Express. Следующее устанавливает пару ключ = значение среды, а затем запускает ваше приложение.

$ PORT=8080 node app.js

Что касается вашего примера кода, вам нужно что-то вроде этого:

var express = require("express");
var app = express();

// sets port 8080 to default or unless otherwise specified in the environment
app.set('port', process.env.PORT || 8080);

app.get('/', function(req, res){
    res.send('hello world');
});

// Only works on 3000 regardless of what I set environment port to or how I set
// [value] in app.set('port', [value]).
// app.listen(3000);
app.listen(app.get('port'));
ЭевуТов
источник
2
Это действительно странно. Я сделал следующее: 1. Поместил app.set()код в свое приложение и изменил 3000 на 8080. Все еще работает app.listen(3000). 2. Измените переменную порта среды на 8080 при запуске приложения узла. Еще только работает app.listen(3000). 3. Перешел в / usr / bin / express (строка 220) и изменил 3000 на 8080. По-прежнему работает только на app.listen(3000). Спасибо за информативный пост. Мне нужно что-то перезапустить? Экспресс не может быть перезапущен из того, что я могу сказать, и перезапуск приложения Node происходит каждый раз, когда я использую,node app.js.
Бенджамин Мартин
@BenjaminMartin Express - это просто модуль, как и любой другой модуль, поэтому его node app.jsзапустит простой (я лично использую nodemonпри разработке и тестировании. Возможно, вы думаете о expressисполняемом файле командной строки, который является вспомогательным процессом, который строит ваш скелет. файловая структура. Можете ли вы опубликовать суть своего кода?
EhevuTov 03
Попался. Обычно я использую только nodemonв сочетании с, nohupчтобы мое приложение работало бесконечно. Я не использую исполняемую версию CL, expressпоэтому она должна перезапускаться каждый раз, когда я перезапускаю свое nodeприложение. См. Мой исходный пост для редактирования с кодом. Спасибо!
Бенджамин Мартин
@BenjaminMartin проверьте нижнюю часть моего ответа и запустите этот код. Это должно работать нормально. Я только что протестировал это на своей машине.
EhevuTov 03
Это еще один полезный способ изменить порт, но он по-прежнему работает, только когда порт 3000. Я начинаю задаваться вопросом, есть ли на моем сервере что-то, что позволяет передавать контент только на определенные порты. Я понятия не имею, где будет находиться эта конфигурация. Может ли это быть проблемой? К вашему сведению, я использую Ubuntu 10.04.
Бенджамин Мартин
31

В bin/www, есть строка:

var port = normalizePort(process.env.PORT || '3000');

Попробуй его модифицировать.

Ларри Лу
источник
1
Я попытался установить порт в app.js, но эта строка переопределила. Это правильное место для смены порта.
Нил
12

Попробуй это

$ PORT=8080 node app.js
Джон Уильямс
источник
1
Спасибо за ответ - это работает, только если у меня установлен app.listen (3000) внутри app.js. Другими словами, установка порта, когда я запускаю приложение, как вы, похоже, не отменяет app.listen ().
Бенджамин Мартин
Отлично. Я использую экспресс: PORT = 8000 npm start. Так что вы можете использовать все, что хотите: D.
Johan Hoeksma
10

Перейдите по этой ссылке.

Попробуйте найти bin> www и попробуйте изменить номер порта ...

Абхишек Гаутам
источник
9

По умолчанию способ изменить порт прослушивания в платформе Express - это изменить файл с именем www в папке bin.

Там вы найдете такую ​​строку, как следующая

var port = normalizePort(process.env.PORT || '3000');

Измените значение 3000 на любой желаемый порт.

Это действительно для Express версии 4.13.1.

АлиАвчи
источник
4

Просто примечание для пользователей Mac OS X и Linux:

Если вы хотите запустить приложение Node / Express на порту ниже 1024, вам нужно запустить его как суперпользователь: sudo PORT=80 node app.js

user3711307
источник
2
Лучшим вариантом для запуска вашего приложения на порте ниже 1024 является перенаправление порта с большим номером. Использование sudo для доступа к порту с номером меньше 1024 обычно считается плохой практикой.
Pieter VDE
4

В последней версии кода с экспресс-генератором (4.13.1) app.js - это экспортированный модуль, а сервер запускается в / bin / www с помощью app.set ('port', process.env.PORT || 3001) в app.js будет заменен аналогичным оператором в bin / www. Я только что изменил инструкцию в bin / www.

user1276682
источник
2

Заметил, что это так и не было решено ... Вероятно, перед вашей машиной стоит брандмауэр, блокирующий эти порты, или iptables настроен для предотвращения использования этих портов.

Попробуйте запустить nmap -F localhost при запуске приложения (установите nmap, если у вас его нет). Если кажется, что вы запускаете приложение на правильном порту и не можете получить к нему доступ через удаленный браузер, значит, есть промежуточное программное обеспечение или физический брандмауэр, который блокирует порт.

Надеюсь это поможет!

user2855232
источник
Это то, что у меня сработало. Забыл разрешить порт.
lalilulelost
2

Найденная вами строка просто ищет переменную окружения PORT, если она определена, она использует ее, в противном случае использует порт по умолчанию 3000. Сначала вы должны определить эту переменную среды (не обязательно быть root)

export PORT=8080
node <your-app.js>
диниго
источник
2

Если вы хотите показать что-то, что подключено к 3000

var express = require('express')
var app = express()

app.get('/', function (req, res) {
  res.send('Hello World!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

Я надеюсь, что это будет вам полезно

MEAbid
источник
1

Ответ по актуальной версии экспресс

Если вы говорите о текущей версии Express , если вы запустите, app.listen()чтобы начать прослушивание, не указывая порт, Express выберет случайный порт для вашего приложения, чтобы узнать, какой порт он в настоящее время работает.

app.listen(0, () => {
    console.log(app.address().port)
}

Должен ли выход порт из ваших app. Более того, этот первый параметр 0можно полностью игнорировать, но это не рекомендуется.

Сайед Хузайфа Хасан
источник
0

Убедитесь, что вы работаете из той папки вашего приложения, где у вас есть package.json.

Шрипарна Саркар
источник
0

Я использую minimistпакет и аргументы запуска узла для управления портом.

node server.js --port 4000

или

node server.js -p 4000

Внутри server.js порт можно определить с помощью

var argv = parseArgs(process.argv.slice(2))

const port = argv.port || argv.p || 3000;
console.log(`Listening on port ${port}...`)

//....listen(port);

и по умолчанию 3000, если порт не передан в качестве аргумента.

Затем вы можете использовать прослушивание portпеременной.

Williamli
источник
0

В app.js просто добавьте ...

process.env.PORT=2999;

Это изолирует переменную PORT от экспресс-приложения.

Марк Лонгмайр
источник
0

Я думаю, что лучший способ - использовать пакет dotenv и установить порт в .envфайле конфигурации, не изменяя файл wwwвнутри папки bin.

Просто установите пакет с помощью команды:

npm install dotenv

требовать это в своем приложении:

require('dotenv').config()

Создайте файл .env в корневом каталоге вашего проекта и добавьте в него порт (например) для прослушивания порта 5000

PORT=5000

и это все.

Больше информации здесь

хукбит
источник
0

Если вы используете Nodemon, я предполагаю, что PORT 3000 установлен в nodemonConfig. Проверьте, так ли это.

Самуэль Адраньи
источник