Aplikasi Node.js / Express.js Hanya Berfungsi pada Port 3000

97

Saya memiliki aplikasi Node.js / Express.js yang berjalan di server saya yang hanya berfungsi pada port 3000 dan saya mencoba mencari tahu alasannya. Inilah yang saya temukan:

  • Tanpa menentukan port ( app.listen()), aplikasi berjalan tetapi halaman web tidak memuat.
  • Pada port 3001 ( app.listen(3001)) atau port lain yang tidak digunakan, aplikasi berjalan tetapi halaman web tidak dimuat.
  • Pada port 2999, aplikasi melontarkan kesalahan karena ada hal lain yang menggunakan port itu.
  • Pada port 3000, aplikasi berjalan dan halaman web dimuat dengan baik.

Saya tahu bahwa aplikasi Express secara default menggunakan port 3000. Tapi anehnya, aplikasi saya hanya berjalan ketika saya secara eksplisit membuatnya berjalan pada port 3000 ( app.listen(3000)).

Saya menemukan ini di baris 220 dari /usr/bin/express:

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

Yang melakukan seperti yang dinyatakan sebelumnya: mengatur port ke apa yang ditentukan atau ke 3000 jika tidak ada yang ditentukan.

Bagaimana saya dapat membuat aplikasi saya berfungsi pada port yang berbeda seperti 8080 atau 3001?

Terima kasih!

Edit: Contoh Kode (Aplikasi Node / Ekspres Sangat Sederhana)

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);
Benjamin Martin
sumber
1) A portdiperlukan oleh .listen(), jadi Anda tidak boleh mencoba tanpa. 2) Apakah Anda mendapatkan kesalahan saat menjalankan aplikasi? Atau apakah itu hanya tampak tidak dapat diakses dari browser? 3) Apakah Anda mencoba untuk mengakses situs web pada mesin yang sama dengan localhost:3000, localhost:3001, dll? Jika Anda menggunakan dua mesin, satu klien dan satu server, Anda harus menambahkan pengecualian ke firewall di server untuk mengizinkan Node menerima permintaan dari klien.
Jonathan Lonowski
Bagaimana Anda meluncurkan aplikasi?
deitch
Adakah kemungkinan Anda dapat memasukkan versi yang telah digosok / dibersihkan ke dalam intinya?
deitch
@Jonathan Senang mengetahui tentang .listen(). Di atas ketika saya mengatakan, "aplikasi berjalan", ini sama dengan yang Anda katakan, "tidak ada kesalahan saat menjalankan aplikasi". Saat saya berkata, "halaman web tidak dimuat", ini sama dengan yang Anda katakan, "tidak dapat diakses dari browser". Semua akses dari mesin yang sama (server saya). Terima kasih untuk umpan baliknya.
Benjamin Martin
1
@deitch Saya menggunakan $ supervisor app.jsatau $ PORT=[PORT] node app.jsketika saya ingin mengatur variabel port lingkungan. Saya akan memberikan contoh kode.
Benjamin Martin

Jawaban:

118

Berikut ini cara kerja jika Anda memiliki sesuatu seperti ini di app.js Anda:

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

Entah secara eksplisit melakukan hardcode kode Anda untuk menggunakan port yang Anda inginkan, seperti:

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

Kode ini berarti setel port Anda ke variabel lingkungan PORTatau jika itu undefinedkemudian setel ke literal 3000.

Atau, gunakan lingkungan Anda untuk mengatur port. Mengaturnya melalui lingkungan digunakan untuk membantu menggambarkan antara PRODUCTIONdan DEVELOPMENTdan banyak Platform sebagai Layanan menggunakan lingkungan untuk mengatur port sesuai dengan spesifikasi mereka serta konfigurasi Express internal. Berikut ini menetapkan pasangan kunci = nilai lingkungan dan kemudian meluncurkan aplikasi Anda.

$ PORT=8080 node app.js

Mengacu pada contoh kode Anda, Anda menginginkan sesuatu seperti ini:

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'));
EhevuTov
sumber
2
Ini sangat aneh. Saya telah melakukan hal berikut: 1. Masukkan app.set()kode ke dalam aplikasi saya dan ubah 3000 menjadi 8080. Masih hanya berfungsi app.listen(3000). 2. Ubah variabel port lingkungan menjadi 8080 saat menjalankan aplikasi node. Masih hanya berfungsi app.listen(3000). 3. Beralih ke / usr / bin / express (baris 220) dan ubah 3000 menjadi 8080. Masih hanya berfungsi app.listen(3000). Terima kasih atas posting informatifnya. Apakah ada yang perlu saya mulai ulang? Express tidak dapat dimulai ulang dari apa yang dapat saya katakan dan memulai ulang aplikasi Node terjadi setiap kali saya menggunakannode app.js.
Benjamin Martin
@BenjaminMartin Express hanyalah sebuah modul seperti modul lainnya, jadi hanya yang sederhana node app.jsakan memulainya (saya pribadi gunakan nodemonsaat mengembangkan dan menguji. Apa yang mungkin Anda pikirkan adalah baris expressperintah yang dapat dieksekusi yang merupakan proses pembantu yang membangun kerangka Anda struktur file. Dapatkah Anda memposting inti kode Anda?
EhevuTov
kena kau. Saya biasanya hanya menggunakan nodemondalam hubungannya dengan nohupuntuk menjaga aplikasi saya berjalan tanpa batas. Saya tidak menggunakan versi CL yang dapat dieksekusi expressjadi harus dimulai ulang setiap kali saya memulai ulang nodeaplikasi saya . Lihat posting asli saya untuk mengedit dengan kode. Terima kasih!
Benjamin Martin
@BenjaminMartin periksa bagian bawah jawaban saya dan jalankan kode itu. Itu seharusnya bekerja dengan baik. Saya baru saja mengujinya di mesin saya.
EhevuTov
Ini adalah cara lain yang berguna untuk mengubah port tetapi masih hanya berfungsi ketika portnya 3000. Saya mulai bertanya-tanya apakah ada sesuatu di server saya yang hanya memungkinkan konten disajikan di port tertentu. Saya tidak tahu di mana konfigurasi ini akan ditempatkan. Mungkinkah ini menjadi masalah? FYI Saya menjalankan Ubuntu 10.04.
Benjamin Martin
31

Di bin/www, ada garis:

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

Cobalah untuk memodifikasinya.

Larry Lu
sumber
1
Saya mencoba mengatur port di app.js tetapi baris ini diganti. Ini adalah tempat yang tepat untuk mengganti port.
Neil
12

Coba ini

$ PORT=8080 node app.js
John Williams
sumber
1
Terima kasih atas jawabannya - ini hanya berfungsi jika saya memiliki app.listen (3000) yang disetel di dalam app.js. Dengan kata lain, menyetel port saat saya menjalankan aplikasi seperti yang telah Anda lakukan sepertinya tidak menimpa app.listen ().
Benjamin Martin
Sempurna. Saya gunakan dengan express: PORT = 8000 npm start. Jadi Anda bisa menggunakan apapun yang Anda inginkan: D.
Johan Hoeksma
10

Lihat tautan ini.

Coba cari lokasi bin> www dan coba ubah nomor port ...

Abhishek Gautam
sumber
9

Cara default untuk mengubah port mendengarkan di kerangka kerja Express adalah dengan mengubah file bernama www di folder bin.

Di sana, Anda akan menemukan garis seperti berikut ini

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

Ubah nilai 3000 ke port mana pun yang Anda inginkan.

Ini berlaku untuk Express versi 4.13.1

AliAvci
sumber
4

Sekadar catatan untuk pengguna Mac OS X dan Linux:

Jika Anda ingin menjalankan aplikasi Node / Express Anda pada nomor port yang lebih rendah dari 1024, Anda harus menjalankan sebagai superuser: sudo PORT=80 node app.js

pengguna3711307
sumber
2
Opsi yang lebih baik untuk menjalankan aplikasi Anda pada port di bawah 1024 adalah meneruskan port dengan nomor yang lebih besar. Menggunakan sudo agar dapat mengakses nomor port yang lebih rendah dari 1024 umumnya dianggap praktik yang buruk.
Pieter VDE
4

Dalam versi kode terbaru dengan generator ekspres (4.13.1) app.js adalah modul yang diekspor dan server dimulai di / bin / www menggunakan app.set ('port', process.env.PORT || 3001) di app.js akan diganti dengan pernyataan serupa di bin / www. Saya baru saja mengubah pernyataan di bin / www.

pengguna1276682
sumber
2

Perhatikan bahwa ini tidak pernah diselesaikan ... Anda mungkin memiliki firewall di depan mesin Anda yang memblokir port tersebut, atau iptables disiapkan untuk mencegah penggunaan port tersebut.

Coba jalankan nmap -F localhost saat Anda menjalankan aplikasi (instal nmap jika Anda tidak memilikinya). Jika tampaknya Anda menjalankan aplikasi di port yang benar dan Anda tidak dapat mengaksesnya melalui browser jarak jauh, maka ada beberapa middleware atau firewall fisik yang memblokir port tersebut.

Semoga ini membantu!

pengguna2855232
sumber
Itulah yang berhasil bagi saya. Lupa mengizinkan port.
lalilelost
2

Baris yang Anda temukan hanya mencari variabel lingkungan PORT, jika ditentukan, ia akan menggunakannya, jika tidak menggunakan port default3000 . Anda harus menentukan variabel lingkungan ini terlebih dahulu (tidak perlu menjadi root)

export PORT=8080
node <your-app.js>
dinigo
sumber
2

Jika Anda ingin menunjukkan sesuatu yang terhubung pada 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!')
})

Saya harap itu akan membantu Anda

MEAbid
sumber
1

Jawab menurut versi ekspres saat ini

Jika Anda berbicara tentang versi ekspres saat ini , jika Anda menjalankan app.listen()untuk mulai mendengarkan tanpa menentukan port, Express akan memilih port acak untuk aplikasi Anda, untuk mencari tahu tentang port mana yang saat ini dijalankan saat digunakan

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

Haruskah keluaran yang pelabuhan dari Anda app. Selain itu, parameter pertama 0dapat diabaikan sama sekali tetapi tidak direkomendasikan

Syed Huzaifa Hassan
sumber
0

Pastikan Anda menjalankan dari folder aplikasi Anda, di mana Anda memiliki package.json.

Shreeparna Sarkar
sumber
0

Saya menggunakan minimistpaket dan argumen permulaan node untuk mengontrol port.

node server.js --port 4000

atau

node server.js -p 4000

Di dalam server.js, port dapat ditentukan oleh

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

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

//....listen(port);

dan defaultnya ke 3000 jika tidak ada port yang dilewatkan sebagai argumen.

Anda kemudian dapat menggunakan mendengarkan pada portvariabel.

williamli
sumber
0

Di app.js, cukup tambahkan ...

process.env.PORT=2999;

Ini akan mengisolasi variabel PORT ke aplikasi ekspres.

Mark Longmire
sumber
0

Menurut saya cara terbaik adalah dengan menggunakan paket dotenv dan mengatur port pada .envfile config tanpa mengubah file wwwdi dalam folder bin.

Cukup instal paket dengan perintah:

npm install dotenv

membutuhkannya di aplikasi Anda:

require('dotenv').config()

Buat file .env di direktori root proyek Anda, dan tambahkan port di dalamnya (misalnya) untuk mendengarkan pada port 5000

PORT=5000

dan hanya itu.

Info selengkapnya di sini

huckbit
sumber
0

Jika Anda menggunakan Nodemon, tebakan saya adalah PORT 3000 diatur di nodemonConfig. Periksa apakah itu masalahnya.

Samuel Adranyi
sumber