Приложение 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


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


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.


2

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

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

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


Это то, что у меня сработало. Забыл разрешить порт.
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!')
})

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


1

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

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

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

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



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переменной.



0

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

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

npm install dotenv

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

require('dotenv').config()

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

PORT=5000

и это все.

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.