Node.js / Express.js Uygulaması Yalnızca Bağlantı Noktası 3000'de Çalışır


97

Sunucumda çalışan ve yalnızca 3000 numaralı bağlantı noktasında çalışan bir Node.js / Express.js uygulamam var ve nedenini anlamaya çalışıyorum. İşte bulduklarım:

  • Bir bağlantı noktası ( app.listen()) belirtmeden uygulama çalışır ancak web sayfası yüklenmez.
  • 3001 ( app.listen(3001)) numaralı bağlantı noktasında veya kullanımda olmayan herhangi bir bağlantı noktasında uygulama çalışır ancak web sayfası yüklenmez.
  • 2999 numaralı bağlantı noktasında, bu bağlantı noktasını başka bir şey kullandığı için uygulama bir hata atar.
  • 3000 numaralı bağlantı noktasında uygulama çalışır ve web sayfası sorunsuz bir şekilde yüklenir.

Express uygulamalarının varsayılan olarak 3000 numaralı bağlantı noktasını kullandığını biliyorum. Ancak tuhaf bir şekilde, uygulamam yalnızca 3000 ( app.listen(3000)) numaralı bağlantı noktasında açıkça çalıştırdığımda çalışıyor .

Bunu 220. satırda buldum /usr/bin/express:

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

Hangisi daha önce belirtildiği gibi yapıyor: bağlantı noktasını belirtilene veya hiçbir şey belirtilmezse 3000'e ayarlamak.

Uygulamamın 8080 veya 3001 gibi farklı bir bağlantı noktasında çalışmasını nasıl sağlayabilirim?

Teşekkürler!

Düzenleme: Kod Örneği (Çok Basit Düğüm / Hızlı Uygulama)

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 portgereklidir .listen(), bu yüzden onsuz gitmeyi denememelisiniz. 2) Uygulamayı çalıştırırken herhangi bir hata alıyor musunuz? Yoksa bir tarayıcıdan erişilemez mi görünüyor? 3) Eğer aynı makinede web sitesine erişmek istiyorsunuz localhost:3000, localhost:3001vb? Bir istemci ve bir sunucu olmak üzere iki makine kullanıyorsanız, Düğümün istemciden istek almasına izin vermek için sunucudaki güvenlik duvarına istisnalar eklemeniz gerekir.
Jonathan Lonowski

Uygulamayı nasıl başlatıyorsunuz?
deitch

Temizlenmiş / sterilize edilmiş bir versiyonu ana hatlara koyma şansınız var mı?
deitch

@Jonathan Hakkında bilmek güzel .listen(). Yukarıda "uygulama çalışıyor" dediğimde bu, "uygulamayı çalıştırırken hata yok" dediğinle aynı. "Web sayfası yüklenmiyor" dediğimde, "bir tarayıcıdan erişilemez" dediğinle aynı. Aynı makineden (sunucum) tüm erişim. Geri dönüşünüz için teşekkür ederiz.
Benjamin Martin

1
@deitch kullanıyorum $ supervisor app.jsveya $ PORT=[PORT] node app.jsortam port değişkenini ayarlamak istediğimde. Bir kod örneği koyacağım.
Benjamin Martin

Yanıtlar:


119

App.js'nizde buna benzer bir şey varsa aşağıdakiler çalışır:

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

İstediğiniz bağlantı noktasını kullanmak için kodunuzu açıkça kodlayın, örneğin:

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

Bu kod, bağlantı noktanızı ortam değişkenine PORTveya daha undefinedsonra değişmez değere ayarlamanız anlamına gelir 3000.

Veya bağlantı noktasını ayarlamak için ortamınızı kullanın. Ortam aracılığıyla ayarlamak, Hizmet olarak birçok Platform arasında PRODUCTIONve DEVELOPMENTayrıca dahili Express yapılandırmalarına göre bağlantı noktasını ayarlamak için ortamı kullanır. Aşağıdakiler bir ortam anahtarı = değer çifti ayarlar ve ardından uygulamanızı başlatır.

$ PORT=8080 node app.js

Kod örneğinize göre, şuna benzer bir şey istiyorsunuz:

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
Bu gerçekten tuhaf. Aşağıdakileri yaptım: 1. app.set()Kodu uygulamamın içine koyun ve 3000'i 8080 olarak değiştirdim app.listen(3000). Hala sadece çalışıyor . 2. Düğüm uygulamasını çalıştırırken ortam port değişkenini 8080 olarak değiştirin. Hala sadece çalışıyor app.listen(3000). 3. / usr / bin / express'e (220 numaralı satır) gitti ve 3000'i 8080 olarak değiştirdi app.listen(3000). Hala sadece çalışıyor . Yine de bilgilendirici gönderi için teşekkürler. Yeniden başlatmam gereken bir şey var mı? Express, anlatabildiğimden yeniden başlatılamıyor ve Node uygulamasını her kullandığımda yeniden başlatmak oluyornode app.js.
Benjamin Martin 13

@BenjaminMartin Express, diğer herhangi bir modül gibi sadece bir modüldür, bu yüzden sadece basit bir node app.jsşekilde başlayacaktır (Ben kişisel nodemonolarak geliştirirken ve test ederken kullanırım . Düşündüğünüz şey express, iskeletinizi oluşturan yardımcı bir süreç olan komut satırı çalıştırılabiliridir dosya yapısı. Kodunuzun bir
özetini gönderebilir

Anladım. Uygulamamın süresiz olarak çalışmasını sağlamak için genellikle yalnızca nodemonile birlikte nohupkullanırım. CL çalıştırılabilir sürümünü kullanmıyorum, expressbu yüzden nodeuygulamamı her yeniden başlattığımda yeniden başlatılması gerekiyor . Kod içeren bir düzenleme için orijinal gönderime bakın. Teşekkürler!
Benjamin Martin

@BenjaminMartin cevabımın altını kontrol et ve bu kodu çalıştır. Bu gayet iyi çalışmalı. Makinemde test ettim.
EhevuTov

Bu, bağlantı noktasını değiştirmenin başka bir kullanışlı yoludur, ancak yine de yalnızca bağlantı noktası 3000 olduğunda çalışır. Sunucumda içeriğin yalnızca belirli bağlantı noktalarında sunulmasına izin veren bir şey olup olmadığını merak etmeye başladım. Yine de bu konfigürasyonun nerede olacağına dair hiçbir fikrim yok. Bu bir sorun olabilir mi? Bilginize Ubuntu 10.04'ü çalıştırıyorum.
Benjamin Martin

32

İçinde bin/wwwbir satır var:

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

Değiştirmeye çalışın.


1
Bağlantı noktasını app.js'de ayarlamayı denedim ama bu satır geçersiz kılıyordu. Bağlantı noktasını değiştirmek için doğru yer burasıdır.
Neil

13

Bunu dene

$ PORT=8080 node app.js

1
Cevabınız için teşekkürler - bu yalnızca app.listen (3000) 'i app.js içinde ayarladığımda işe yarar. Başka bir deyişle, uygulamayı çalıştırdığımda bağlantı noktasını sizin yaptığınız gibi ayarlamak app.listen () 'i geçersiz kılıyor gibi görünmüyor.
Benjamin Martin

Mükemmel. Express ile kullandığım: PORT = 8000 npm start. Böylece istediğinizi kullanabilirsiniz: D.
Johan Hoeksma

11

Bu bağlantıya bakın.

Bölme> www konumunu bulmaya çalışın ve bağlantı noktası numarasını değiştirmeyi deneyin ...


9

Express çerçevesindeki dinleme bağlantı noktasını değiştirmenin varsayılan yolu, bin klasöründeki www adlı dosyayı değiştirmektir.

Orada aşağıdaki gibi bir satır bulacaksınız

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

3000 değerini istediğiniz herhangi bir bağlantı noktasına değiştirin.

Bu, Express sürüm 4.13.1 için geçerlidir


4

Mac OS X ve Linux kullanıcıları için sadece bir not:

Node / Express uygulamanızı 1024'ten daha düşük bir bağlantı noktası numarasında çalıştırmak istiyorsanız, süper kullanıcı olarak çalıştırmanız gerekir: sudo PORT=80 node app.js


2
Uygulamanızı 1024'ün altındaki bir bağlantı noktasında çalıştırmak için daha iyi bir seçenek, daha büyük numaralı bir bağlantı noktasını iletmektir. 1024'ten daha düşük bir bağlantı noktası numarasına erişebilmek için sudo kullanmak genellikle kötü bir uygulama olarak kabul edilir.
Pieter VDE

4

Express-generator (4.13.1) ile kodun en son sürümünde, app.js dışa aktarılmış bir modüldür ve sunucu app.set ('port', process.env.PORT || 3001) kullanılarak / bin / www içinde başlatılır. app.js'deki benzer bir ifade bin / www ile geçersiz kılınır. Bin / www'deki ifadeyi değiştirdim.


2

Bunun asla çözülemediğini fark ettim ... Büyük olasılıkla makinenizin önünde bu bağlantı noktalarını engelleyen bir güvenlik duvarınız var veya iptables bu bağlantı noktalarının kullanımını önlemek için ayarlanmış.

Uygulamanızı çalıştırdığınızda nmap -F localhost'u çalıştırmayı deneyin (yoksa nmap yükleyin). Uygulamayı doğru bağlantı noktasında çalıştırıyormuşsunuz gibi görünüyorsa ve ona uzak bir tarayıcı aracılığıyla erişemiyorsanız, bağlantı noktasını engelleyen bir ara yazılım veya fiziksel bir güvenlik duvarı vardır.

Bu yardımcı olur umarım!


Benim için çalışan buydu. Bağlantı noktasına izin vermeyi unuttum.
lalilulelost

2

Bulduğunuz satır sadece çevresel değişkeni arar PORT, eğer tanımlıysa kullanır, aksi takdirde varsayılan bağlantı noktasını kullanır 3000. Önce bu çevresel değişkeni tanımlamalısınız (kök olmaya gerek yok)

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

2

3000'e bağlı olduğunuzu göstermek istiyorsanız

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!')
})

Umarım bu sana yardımcı olur


1

Express'in mevcut sürümüne göre cevaplayın

Express'in mevcut sürümü hakkında konuşursanız , app.listen()bağlantı noktası belirtmeden dinlemeye başlarsanız, Express şu anda hangi bağlantı noktasının kullanımda çalıştığını bulmak için uygulamanız için rastgele bir bağlantı noktası seçecektir.

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

Should çıkış portu , aramalarınızdan app. Üstelik bu ilk parametre 0tamamen göz ardı edilebilir, ancak önerilmez


1

minimistBağlantı noktasını kontrol etmek için paketi ve düğüm başlangıç ​​argümanlarını kullanıyorum.

node server.js --port 4000

veya

node server.js -p 4000

Server.js içinde, bağlantı noktası şu şekilde belirlenebilir:

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

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

//....listen(port);

ve bağımsız değişken olarak bağlantı noktası aktarılmazsa varsayılan olarak 3000'dir.

Daha sonra portdeğişkeni dinleyebilirsiniz .


tek tire -pbenim için çalışmadı. Ama çift tire --pçalışıyor. Bu cevap için teşekkürler.
Muthu Kumaran

0

Package.json dosyasının bulunduğu uygulamanızın o klasöründen çalıştırdığınızdan emin olun.


0

App.js'de şunu ekleyin ...

process.env.PORT=2999;

Bu, PORT değişkenini ekspres uygulamaya izole edecektir.


0

Bence en iyi yol dotenv paketini kullanmak ve klasör içindeki .envdosyayı değiştirmeden yapılandırma dosyasındaki bağlantı noktasını ayarlamak .wwwbin

Paketi şu komutla kurmanız yeterlidir:

npm install dotenv

başvurunuzda gerekli:

require('dotenv').config()

Projenizin kök dizininde bir .env dosyası oluşturun ve 5000 numaralı bağlantı noktasını dinlemek için (örneğin) bağlantı noktasını ekleyin.

PORT=5000

ve bu kadar.

Daha fazla bilgi burada


0

Nodemon kullanıyorsanız, tahminim, PORT 3000'in nodemonConfig içinde ayarlandığıdır. Durumun bu olup olmadığını kontrol edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.