Ứng dụng Node.js / Express.js Chỉ hoạt động trên Cổng 3000


96

Tôi có một ứng dụng Node.js / Express.js đang chạy trên máy chủ của mình chỉ hoạt động trên cổng 3000 và tôi đang cố gắng tìm hiểu lý do. Đây là những gì tôi đã tìm thấy:

  • Mà không chỉ định một cổng ( app.listen()), chạy ứng dụng nhưng trang web không tải.
  • Trên cổng 3001 ( app.listen(3001)) hoặc bất kỳ cổng nào khác không được sử dụng, ứng dụng chạy nhưng trang web không tải.
  • Trên cổng 2999, ứng dụng gặp lỗi do có thứ khác đang sử dụng cổng đó.
  • Trên cổng 3000, ứng dụng chạy và trang web tải tốt.

Tôi biết rằng ứng dụng Express mặc định ở cổng 3000. Nhưng kỳ lạ là ứng dụng của tôi chỉ chạy khi tôi bắt nó chạy trên cổng 3000 ( app.listen(3000)) một cách rõ ràng .

Tôi tìm thấy điều này trên dòng 220 của /usr/bin/express:

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

Điều đang làm như đã nêu trước đây: đặt cổng thành những gì được chỉ định hoặc thành 3000 nếu không có gì được chỉ định.

Làm cách nào để làm cho ứng dụng của tôi hoạt động trên một cổng khác, chẳng hạn như 8080 hoặc 3001?

Cảm ơn!

Chỉnh sửa: Mẫu mã (Ứng dụng rất đơn giản / Nút nhanh)

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được yêu cầu bởi .listen(), vì vậy bạn không nên thử mà không có. 2) Bạn có gặp bất kỳ lỗi nào khi chạy ứng dụng không? Hay nó chỉ có vẻ không thể truy cập được từ trình duyệt? 3) Bạn đang cố gắng truy cập trang web trên cùng một máy với localhost:3000, localhost:3001vv? Nếu bạn đang sử dụng hai máy, một máy khách và một máy chủ, bạn sẽ cần thêm ngoại lệ vào tường lửa trên máy chủ để cho phép Node nhận yêu cầu từ máy khách.
Jonathan Lonowski

Bạn khởi chạy ứng dụng như thế nào?
deitch

Bất kỳ cơ hội nào bạn có thể đưa một phiên bản đã được làm sạch / làm vệ sinh lên trong ý chính?
deitch

@Jonathan Thật tốt khi biết về .listen(). Ở trên khi tôi nói, "ứng dụng đang chạy", điều này cũng giống như bạn nói, "không có lỗi khi chạy ứng dụng". Khi tôi nói, "trang web không tải", điều này cũng giống như bạn nói, "không thể truy cập từ trình duyệt". Tất cả truy cập từ cùng một máy (máy chủ của tôi). Cảm ơn vì bạn đã phản hồi.
Benjamin Martin

1
@deitch Tôi đang sử dụng $ supervisor app.jshoặc $ PORT=[PORT] node app.jskhi tôi muốn đặt biến cổng môi trường. Tôi sẽ đưa ra một mẫu mã.
Benjamin Martin

Câu trả lời:


117

Những điều sau sẽ hoạt động nếu bạn có một cái gì đó như thế này trong app.js của mình:

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

Mã hóa cứng rõ ràng mã của bạn để sử dụng cổng bạn muốn, như:

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

Mã này có nghĩa là đặt cổng của bạn thành biến môi trường PORThoặc nếu điều undefinedđó được đặt thì hãy đặt nó thành chữ 3000.

Hoặc, sử dụng môi trường của bạn để đặt cổng. Đặt nó thông qua môi trường được sử dụng để giúp phân định giữa PRODUCTIONDEVELOPMENTvà nhiều Nền tảng như một Dịch vụ sử dụng môi trường để đặt cổng theo thông số kỹ thuật của chúng cũng như cấu hình Express nội bộ. Phần sau đặt cặp khóa môi trường = giá trị và sau đó khởi chạy ứng dụng của bạn.

$ PORT=8080 node app.js

Tham chiếu đến ví dụ mã của bạn, bạn muốn một cái gì đó như sau:

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
Điều này thật kỳ quái. Tôi đã thực hiện như sau: 1. Đặt app.set()mã bên trong ứng dụng của tôi và thay đổi 3000 thành 8080. Vẫn chỉ hoạt động trên app.listen(3000). 2. Thay đổi biến cổng môi trường thành 8080 khi chạy ứng dụng nút. Vẫn chỉ hoạt động trên app.listen(3000). 3. Chuyển sang / usr / bin / express (dòng 220) và thay đổi 3000 thành 8080. Vẫn chỉ hoạt động trên app.listen(3000). Cảm ơn bạn cho bài viết thông tin mặc dù. Có điều gì tôi cần khởi động lại không? Express không thể được khởi động lại từ những gì tôi có thể nói và khởi động lại ứng dụng Node xảy ra mỗi khi tôi sử dụngnode app.js.
Benjamin Martin

@BenjaminMartin Express chỉ là một mô-đun giống như bất kỳ mô-đun nào khác, vì vậy chỉ cần một mô-đun đơn giản node app.jssẽ khởi động nó (Cá nhân tôi sử dụng nodemonkhi phát triển và thử nghiệm. Những gì bạn có thể nghĩ đến là expressthực thi dòng lệnh là một quy trình trợ giúp xây dựng bộ xương của bạn cấu trúc tệp. Bạn có thể đăng ý chính về mã của mình không?
EhevuTov

gotcha. Tôi thường chỉ sử dụng nodemonkết hợp với nohupđể giữ cho ứng dụng của mình chạy vô thời hạn. Tôi không sử dụng phiên bản thực thi CL expressnên nó phải khởi động lại mỗi khi tôi khởi động lại nodeứng dụng của mình . Xem bài đăng ban đầu của tôi để chỉnh sửa với mã. Cảm ơn!
Benjamin Martin

@BenjaminMartin kiểm tra phần cuối câu trả lời của tôi và chạy mã đó. Điều đó sẽ làm việc tốt. Tôi vừa thử nghiệm nó trên máy của tôi.
EhevuTov

Đây là một cách hữu ích khác để thay đổi cổng nhưng nó vẫn chỉ hoạt động khi cổng là 3000. Tôi bắt đầu tự hỏi liệu có thứ gì đó trên máy chủ của tôi chỉ cho phép nội dung được phân phát trên một số cổng nhất định hay không. Tôi không biết cấu hình này sẽ được đặt ở đâu. Điều này có thể là một vấn đề? FYI Tôi đang chạy Ubuntu 10.04.
Benjamin Martin

31

Trong bin/www, có một dòng:

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

Cố gắng sửa đổi nó.


1
Tôi đã thử đặt cổng trong app.js nhưng dòng này bị ghi đè. Đây là nơi chính xác để thay đổi cổng.
Neil

12

Thử cái này

$ PORT=8080 node app.js

1
Cảm ơn câu trả lời - điều này chỉ hoạt động nếu tôi đã đặt app.listen (3000) bên trong app.js. Nói cách khác, việc đặt cổng khi tôi chạy ứng dụng như bạn đã làm dường như không ghi đè app.listen ().
Benjamin Martin

Hoàn hảo. Tôi sử dụng là với express: PORT = 8000 npm start. Vì vậy, bạn có thể sử dụng bất cứ điều gì bạn muốn: D.
Johan Hoeksma

10

Tham khảo liên kết này.

Cố gắng xác định vị trí bin> www và cố gắng thay đổi số cổng ...


9

Cách mặc định để thay đổi cổng lắng nghe trên The Express framework là sửa đổi tệp có tên www trong thư mục bin.

Ở đó, bạn sẽ tìm thấy một dòng như sau

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

Thay đổi giá trị 3000 thành bất kỳ cổng nào bạn muốn.

Điều này hợp lệ cho phiên bản Express 4.13.1


4

Chỉ cần lưu ý cho người dùng Mac OS X và Linux:

Nếu bạn muốn chạy ứng dụng Node / Express của mình trên số cổng thấp hơn 1024, bạn phải chạy với tư cách là superuser: sudo PORT=80 node app.js


2
Một lựa chọn tốt hơn để chạy ứng dụng của bạn trên cổng dưới 1024 là chuyển tiếp một cổng có số lượng lớn hơn. Sử dụng sudo để có thể truy cập số cổng thấp hơn 1024 thường được coi là hành vi xấu.
Pieter VDE

4

Trong phiên bản mới nhất của mã với express-maker (4.13.1), app.js là một mô-đun được xuất và máy chủ được khởi động trong / bin / www bằng app.set ('port', process.env.PORT || 3001) trong app.js sẽ bị ghi đè bởi một câu lệnh tương tự trong bin / www. Tôi vừa thay đổi câu lệnh trong bin / www.


2

Nhận thấy điều này không bao giờ được giải quyết ... Bạn có thể có một tường lửa phía trước máy tính của bạn chặn các cổng đó hoặc iptables được thiết lập để ngăn việc sử dụng các cổng đó.

Thử chạy nmap -F localhost khi bạn chạy ứng dụng của mình (cài đặt nmap nếu bạn không có). Nếu có vẻ như bạn đang chạy ứng dụng trên đúng cổng và bạn không thể truy cập nó qua trình duyệt từ xa thì có một số phần mềm trung gian hoặc tường lửa vật lý đang chặn cổng.

Hi vọng điêu nay co ich!


Đó là những gì đã làm việc cho tôi. Quên cho phép cổng.
lalilulelost

2

Dòng bạn tìm thấy chỉ tìm kiếm biến môi trường PORT, nếu nó được định nghĩa thì nó sử dụng nó, nếu không thì sử dụng cổng mặc định 3000. Bạn phải xác định biến môi trường này trước (không cần phải là root)

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

2

Nếu bạn muốn hiển thị một cái gì đó bạn đã kết nối trên 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!')
})

Tôi hy vọng điều đó sẽ hữu ích cho bạn


1

Trả lời theo phiên bản hiện tại của express

Nếu bạn nói về phiên bản express hiện tại , nếu bạn chạy app.listen()để bắt đầu nghe mà không chỉ định cổng, Express sẽ chọn một cổng ngẫu nhiên cho ứng dụng của bạn, để tìm hiểu về cổng mà ứng dụng hiện đang được sử dụng.

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

có nên sản lượng các cổng của bạn app. Hơn nữa, thông số đầu tiên 0có thể bị bỏ qua hoàn toàn nhưng không được khuyến khích


0

Đảm bảo rằng bạn đang chạy từ thư mục đó của ứng dụng, nơi bạn có package.json.


0

Tôi đang sử dụng minimistgói và các đối số khởi động nút để điều khiển cổng.

node server.js --port 4000

hoặc là

node server.js -p 4000

Bên trong server.js, cổng có thể được xác định bởi

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

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

//....listen(port);

và nó mặc định là 3000 nếu không có cổng nào được chuyển làm đối số.

Sau đó, bạn có thể sử dụng nghe trên portbiến.


0

Trong app.js, chỉ cần thêm ...

process.env.PORT=2999;

Điều này sẽ cách ly biến PORT với ứng dụng nhanh.


0

Tôi nghĩ rằng cách tốt nhất là sử dụng gói dotenv và đặt cổng trên .envtệp cấu hình mà không cần sửa đổi tệp wwwbên trong thư mục bin.

Chỉ cần cài đặt gói bằng lệnh:

npm install dotenv

yêu cầu nó trong ứng dụng của bạn:

require('dotenv').config()

Tạo tệp .env trong thư mục gốc của dự án của bạn và thêm cổng vào đó (ví dụ) để nghe trên cổng 5000

PORT=5000

và đó là nó.

Thông tin thêm tại đây


0

Nếu bạn đang sử dụng Nodemon, dự đoán của tôi là PORT 3000 được đặt trong NodemonConfig. Kiểm tra xem đó có phải là trường hợp không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.