แอป 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จำเป็นต้องมีA .listen()ดังนั้นคุณไม่ควรลองทำโดยไม่มี 2) คุณได้รับข้อผิดพลาดเมื่อเรียกใช้แอปพลิเคชันหรือไม่? หรือดูเหมือนว่าไม่สามารถเข้าถึงได้จากเบราว์เซอร์? 3) คุณพยายามที่จะเข้าถึงเว็บไซต์ในเครื่องเดียวกันกับlocalhost:3000, localhost:3001ฯลฯ ? หากคุณกำลังใช้สองเครื่องไคลเอนต์หนึ่งเครื่องและเซิร์ฟเวอร์หนึ่งเครื่องคุณจะต้องเพิ่มข้อยกเว้นให้กับไฟร์วอลล์บนเซิร์ฟเวอร์เพื่อให้ Node รับคำขอจากไคลเอนต์
Jonathan Lonowski

คุณเปิดตัวแอปอย่างไร
deitch

มีโอกาสใดบ้างที่คุณสามารถใส่เวอร์ชันขัดผิว / ฆ่าเชื้อไว้ในส่วนสำคัญ?
deitch

@ โจนาธานเรื่องน่ารู้.listen(). ข้างบนเมื่อฉันพูดว่า "แอปทำงาน" นี่ก็เหมือนกับที่คุณพูดว่า "ไม่มีข้อผิดพลาดเมื่อเรียกใช้แอปพลิเคชัน" เมื่อฉันพูดว่า "หน้าเว็บไม่โหลด" นี่ก็เหมือนกับที่คุณพูดว่า "ไม่สามารถเข้าถึงได้จากเบราว์เซอร์" การเข้าถึงทั้งหมดจากเครื่องเดียวกัน (เซิร์ฟเวอร์ของฉัน) ขอบคุณสำหรับความคิดเห็น.
Benjamin Martin

1
@deitch ฉันกำลังใช้$ supervisor app.jsหรือ$ PORT=[PORT] node app.jsเมื่อฉันต้องการตั้งค่าตัวแปรพอร์ตสภาพแวดล้อม ฉันจะใส่ตัวอย่างโค้ด
Benjamin Martin

คำตอบ:


119

ต่อไปนี้ใช้งานได้หากคุณมีสิ่งนี้ใน 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()รหัสภายใน app ของฉันและการเปลี่ยนแปลง 3000 8080 app.listen(3000)ยังคงทำงานได้เฉพาะใน 2. เปลี่ยนตัวแปรพอร์ตสภาพแวดล้อมเป็น 8080 เมื่อเรียกใช้แอปโหนด app.listen(3000)ยังคงทำงานได้เฉพาะใน 3. ไป / usr / bin / ด่วน (สาย 220) และการเปลี่ยนแปลง 3000 8080 app.listen(3000)ยังคงทำงานได้เฉพาะใน ขอบคุณสำหรับโพสต์ข้อมูลว่า มีบางอย่างที่ต้องรีสตาร์ทหรือไม่? Express ไม่สามารถเริ่มต้นใหม่ได้จากสิ่งที่ฉันบอกได้และการรีสตาร์ทแอป Node จะเกิดขึ้นทุกครั้งที่ฉันใช้node app.js.
Benjamin Martin

@BenjaminMartin Express เป็นเพียงโมดูลที่เหมือนกับโมดูลอื่น ๆ ดังนั้นเพียงแค่node app.jsเริ่มต้นอย่างง่าย ๆ(โดยส่วนตัวแล้วฉันใช้nodemonเมื่อพัฒนาและทดสอบสิ่งที่คุณอาจคิดคือexpressไฟล์ปฏิบัติการบรรทัดคำสั่งซึ่งเป็นกระบวนการช่วยเหลือที่สร้างโครงกระดูกของคุณ โครงสร้างไฟล์คุณสามารถโพสต์ส่วนสำคัญของโค้ดของคุณได้หรือไม่
EhevuTov

gotcha โดยปกติฉันจะใช้nodemonร่วมกับnohupเพื่อให้แอปของฉันทำงานไปเรื่อย ๆ ฉันไม่ได้ใช้เวอร์ชันปฏิบัติการ CL expressดังนั้นจึงต้องรีสตาร์ททุกครั้งที่รีสตาร์ทnodeแอป ดูโพสต์ต้นฉบับของฉันสำหรับการแก้ไขด้วยรหัส ขอบคุณ!
Benjamin Martin

@BenjaminMartin ตรวจสอบด้านล่างของคำตอบของฉันและเรียกใช้รหัสนั้น นั่นควรจะใช้งานได้ดี ฉันเพิ่งทดสอบบนเครื่องของฉัน
EhevuTov

นี่เป็นอีกวิธีที่มีประโยชน์ในการเปลี่ยนพอร์ต แต่ยังใช้ได้เฉพาะเมื่อพอร์ตเป็น 3000 ฉันเริ่มสงสัยว่ามีบางอย่างบนเซิร์ฟเวอร์ของฉันที่อนุญาตให้แสดงเนื้อหาบนพอร์ตบางพอร์ตเท่านั้น ฉันไม่รู้ว่าการกำหนดค่านี้จะอยู่ที่ใด นี่อาจเป็นปัญหาหรือไม่? FYI ฉันใช้ Ubuntu 10.04
Benjamin Martin

32

ในbin/wwwมีเส้น:

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

ลองดัดแปลงดู


1
ฉันพยายามตั้งค่าพอร์ตใน app.js แต่บรรทัดนี้ถูกลบล้าง นี่คือตำแหน่งที่ถูกต้องในการเปลี่ยนพอร์ต
Neil

13

ลองทำตามนี้

$ PORT=8080 node app.js

1
ขอบคุณสำหรับคำตอบ - ใช้ได้เฉพาะเมื่อฉันมี app.listen (3000) ที่ตั้งค่าไว้ใน app.js กล่าวอีกนัยหนึ่งการตั้งค่าพอร์ตเมื่อฉันเรียกใช้แอพตามที่คุณทำดูเหมือนจะไม่แทนที่ app.listen ()
Benjamin Martin

สมบูรณ์แบบ. ฉันใช้กับ express: 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 คุณต้องเรียกใช้ในฐานะ superuser: 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คุณต้องกำหนดตัวแปรสภาพแวดล้อมนี้ก่อน (ไม่จำเป็นต้องรูท)

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สามารถละเว้นได้ทั้งหมด แต่ไม่แนะนำ


1

ฉันใช้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ตัวแปร


ยัติภังค์เดี่ยว-pไม่ได้ผลสำหรับฉัน แต่ยัติภังค์คู่--pทำงาน ขอบคุณสำหรับคำตอบนี้
Muthu Kumaran



0

ผมคิดว่าวิธีที่ดีที่สุดคือการใช้dotenvแพคเกจและการตั้งค่าพอร์ตใน.envไฟล์ config โดยไม่ต้องไปแก้ไขไฟล์ภายในโฟลเดอร์wwwbin

เพียงติดตั้งแพ็คเกจด้วยคำสั่ง:

npm install dotenv

ต้องการมันในใบสมัครของคุณ:

require('dotenv').config()

สร้างไฟล์. env ในไดเร็กทอรีรูทของโปรเจ็กต์ของคุณและเพิ่มพอร์ตในนั้น (ตัวอย่าง) เพื่อฟังบนพอร์ต 5000

PORT=5000

และนั่นแหล่ะ

ข้อมูลเพิ่มเติมที่นี่


0

หากคุณใช้ Nodemon ฉันเดาว่า PORT 3000 ถูกตั้งค่าไว้ใน nodemonConfig ตรวจสอบว่าเป็นเช่นนั้นหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.