Додаток Node.js / Express.js працює лише на порту 3000


96

У мене на сервері працює програма 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?

Дякую!

Редагувати: зразок коду (дуже простий вузол / програма 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) A portвимагається .listen(), тому вам не слід намагатись обійтись. 2) Чи виникають помилки під час запуску програми? Або це просто здається недоступним із браузера? 3) Ви намагаєтеся отримати доступ до веб - сайт на одній машині з localhost:3000, localhost:3001і так далі? Якщо ви використовуєте дві машини, один клієнт та один сервер, вам потрібно буде додати винятки до брандмауера на сервері, щоб дозволити Node отримувати запити від клієнта.
Джонатан Лоновський

Як ви запускаєте додаток?
deitch

Будь-який шанс ви можете викласти очищену / дезінфіковану версію в суть?
deitch

@Jonathan Добре знати про .listen(). Вище, коли я кажу: "додаток працює", це те саме, що ви говорите, "відсутність помилок під час запуску програми". Коли я кажу, "веб-сторінка не завантажується", це те саме, що ви говорите, "недоступна з браузера". Весь доступ з тієї ж машини (мого сервера). Дякуємо за відгук.
Benjamin Martin

1
@deitch я використовую $ supervisor app.jsабо $ PORT=[PORT] node app.jsколи хочу встановити змінну порту середовища. Я викладу зразок коду.
Benjamin Martin

Відповіді:


117

Наступне працює, якщо у вас є щось подібне у вашому 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 під час запуску програми node. Досі працює лише на app.listen(3000). 3. Перейшов до / usr / bin / express (рядок 220) і змінив 3000 на 8080. Досі працює лише на app.listen(3000). Дякую за інформаційний пост. Чи потрібно щось перезапустити? Express неможливо перезапустити з того, що я можу сказати, і перезапуск програми Node відбувається кожного разу, коли я використовуюnode app.js.
Бенджамін Мартін

@BenjaminMartin Express - це просто модуль, як і будь-який інший модуль, тому його node app.jsзапустить просто (я особисто використовую його nodemonпід час розробки та тестування. Те, про що ви можете подумати, - це expressвиконуваний файл командного рядка, який є допоміжним процесом, який будує ваш скелет. файлова структура. Чи можете ви опублікувати суть свого коду?
EhevuTov

gotcha. Зазвичай я використовую лише nodemonспільно з, nohupщоб продовжувати працювати свій додаток необмежено довго. Я не використовую виконувану версію CL, expressтому вона повинна перезавантажуватися кожного разу, коли я перезапускаю nodeпрограму. Дивіться мою оригінальну публікацію для редагування з кодом. Дякую!
Benjamin Martin

@BenjaminMartin перевірте нижню частину моєї відповіді та запустіть цей код. Це має спрацювати чудово. Я щойно перевірив це на своїй машині.
EhevuTov

Це ще один корисний спосіб змінити порт, але він все ще працює лише тоді, коли порт становить 3000. Я починаю гадати, чи є щось на моєму сервері, що дозволяє розміщувати вміст лише на певних портах. Я навіть не уявляю, де буде розташована ця конфігурація. Це може бути проблемою? FYI Я працюю під 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 нмм старт. Тож ви можете використовувати все, що завгодно: D.
Йохан Хоексма,


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, як правило, вважається поганою практикою.
Пітер 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.