NodeJS: Làm thế nào để có được cổng của máy chủ?


142

Bạn thường thấy ví dụ mã thế giới xin chào cho Node tạo Máy chủ http, bắt đầu nghe trên một cổng, sau đó theo sau là một cái gì đó dọc theo dòng:

console.log('Server is listening on port 8000');

Nhưng lý tưởng hơn là bạn muốn điều này thay vào đó:

console.log('Server is listening on port ' + server.port);

Làm cách nào để truy xuất cổng mà máy chủ hiện đang nghe mà không lưu số trong một biến trước khi gọi server.listen()?

Tôi đã thấy điều này được thực hiện trước đây nhưng tôi không thể tìm thấy nó trong tài liệu Node. Có lẽ đó là một cái gì đó cụ thể để thể hiện?


3
Tìm trongreq.headers.host
Andrew_1510

Câu trả lời:


161

Câu trả lời 4.x:

Express 4.x (theo câu trả lời của Tiến Do bên dưới), hiện xử lý app.listen () dưới dạng hoạt động không đồng bộ, do đó listener.address () sẽ chỉ trả về dữ liệu bên trong cuộc gọi lại của app.listen ():

var app = require('express')();

var listener = app.listen(8888, function(){
    console.log('Listening on port ' + listener.address().port); //Listening on port 8888
});

Thể hiện 3 câu trả lời:

Tôi nghĩ rằng bạn đang tìm kiếm điều này (thể hiện cụ thể?):

console.log("Express server listening on port %d", app.address().port)

Bạn có thể đã thấy điều này (dòng dưới cùng), khi bạn tạo cấu trúc thư mục từ expresslệnh:

alfred@alfred-laptop:~/node$ express test4
   create : test4
   create : test4/app.js
   create : test4/public/images
   create : test4/public/javascripts
   create : test4/logs
   create : test4/pids
   create : test4/public/stylesheets
   create : test4/public/stylesheets/style.less
   create : test4/views/partials
   create : test4/views/layout.jade
   create : test4/views/index.jade
   create : test4/test
   create : test4/test/app.test.js
alfred@alfred-laptop:~/node$ cat test4/app.js 

/**
 * Module dependencies.
 */

var express = require('express');

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.use(express.bodyDecoder());
  app.use(express.methodOverride());
  app.use(express.compiler({ src: __dirname + '/public', enable: ['less'] }));
  app.use(app.router);
  app.use(express.staticProvider(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

// Routes

app.get('/', function(req, res){
  res.render('index.jade', {
    locals: {
        title: 'Express'
    }
  });
});

// Only listen on $ node app.js

if (!module.parent) {
  app.listen(3000);
  console.log("Express server listening on port %d", app.address().port)
}

1
Cảm ơn, tôi nghĩ đó chính xác là những gì tôi đang tìm kiếm. Tôi sẽ chấp nhận nó ngay khi tôi có cơ hội thử nghiệm nó. Chúc mừng.
David Tang

4
Và nếu bạn không muốn có biến đó, var listenerbạn có thể sử dụng this.address().portbên trong app.listen()cuộc gọi lại
Andrei Stalbe

Điều này trông như thế nào trong Express 5.x?
Diogenes

2
Bạn cũng có thể lấy cổng ở bất cứ đâu trong phần mềm trung gian: req.socket.address (). Port
jlguenego

Chỉ cần thêm vào những gì @AndreiStalbe đã nói, bạn có thể sử dụng this.address.port()nhưng bạn không thể sử dụng nó trong một hàm mũi tên. bạn sẽ cần phải học trường cũ app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(vâng, tôi biết backticks đẹp hơn, nhưng tôi không thể thực hiện chúng trong các bình luận tràn về ngăn xếp)
WORMSS

65

Trong bản v3.0,

/* No longer valid */
var app = express.createServer();
app.listen();
console.log('Server running on %s', app.address().port);

công việc ngắn hạn! Đối với Express v3.0, bạn nên tạo một ứng dụng và máy chủ theo cách này:

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

app.get('/', function(req, res) {
    res.send("Hello World!");
});

server.listen(3000);
console.log('Express server started on port %s', server.address().port);

Tôi đã chạy vào vấn đề này bản thân mình và muốn ghi lại cú pháp mới. Điều này và các thay đổi khác trong Express v3.0 có thể nhìn thấy tại https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x


Hoặc bạn chỉ có thể sử dụng phương pháp cũ để tạo máy chủ vẫn hoạt động. Dường như không còn cách nào để truy cập vào lời bạt cổng. Tuy nhiên, vì bạn đang tự chỉ định cổng trong lệnh gọi đến server.listen, nên thực sự không cần sử dụng cổng server.address ()., Vì bạn chỉ có thể sử dụng cùng một giá trị mà bạn đã chuyển vào server.listen.
Mary Hamlin

(Mặc dù tôi mới đọc hướng dẫn di chuyển và thấy rằng phương pháp tạo ứng dụng và máy chủ mà bạn đã đề cập ở trên thực sự là phương pháp ưa thích mới.)
Mary Hamlin

3
@Mary Hamlin: Điều này rất hữu ích nếu bạn chuyển 0đến server.listen(), trong trường hợp đó, một số cổng ngẫu nhiên được gán. Bạn có thể làm điều này nếu bạn đang chạy một số ứng dụng Express trên một máy chủ và bạn không muốn gán số cổng theo cách thủ công.
Nate

app.listen()cũng trả về thể hiện của máy chủ http.
Vicary

23

Trong phiên bản hiện tại (v0.5.0-pre), cổng dường như có sẵn như một thuộc tính trên đối tượng máy chủ, xem http://nodejs.org/docs/v0.4.7/api/net.html#server.address

var server = http.createServer(function(req, res) {
    ...
}

server.listen(8088);
console.log(server.address());
console.log(server.address().address);
console.log(server.address().port);

đầu ra

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088

22

Trong trường hợp khi bạn cần một cổng tại thời điểm xử lý yêu cầu và ứng dụng không khả dụng, bạn có thể sử dụng điều này:

request.socket.localPort

17

Nếu bạn đang sử dụng express, bạn có thể lấy nó từ đối tượng yêu cầu:

req.app.settings.port // => 8080 or whatever your app is listening at.

14

Tôi sử dụng cách này Express 4:

app.listen(1337, function(){
  console.log('Express listening on port', this.address().port);
});

Bằng cách sử dụng này, tôi không cần sử dụng một biến riêng cho người nghe / máy chủ.


1
Câu trả lời tốt nhất cho đến nay! Nếu bạn đang sử dụng ES6, không sử dụng các hàm mũi tên. thissẽ không được xác định.
Laxmana

9

Yêu cầu mô-đun http là không bao giờ cần thiết.

Việc nhập thêm httplà không cần thiết trong Express 3 hoặc 4. Gán kết quả listen()là đủ.

var server = require('express')();

server.get('/', function(req, res) {
  res.send("Hello Foo!");
});

var listener = server.listen(3000);
console.log('Your friendly Express server, listening on port %s', listener.address().port);
// Your friendly Express server, listening on port 3000

Một lần nữa, điều này được thử nghiệm trong Express 3.5.1 & 4.0.0. Nhập khẩu httplà không bao giờ cần thiết. Phương thức nghe trả về một đối tượng máy chủ http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531


6

Với node.js mới nhất (v0.3.8-pre): Tôi đã kiểm tra tài liệu, kiểm tra phiên bản máy chủ được trả về bởi http.createServer () và đọc mã nguồn của server.listen () ...

Đáng buồn thay, cổng chỉ được lưu trữ tạm thời như một biến cục bộ và kết thúc như một đối số trong lệnh gọi tới process.binding ('net'). Bind () là một phương thức riêng. Tôi không nhìn xa hơn.

Dường như không có cách nào tốt hơn là giữ một tham chiếu đến giá trị cổng mà bạn đã cung cấp cho server.listen ().


1
+1 và cảm ơn về nghiên cứu. Tôi chấp nhận câu trả lời của Alfred vì anh ấy đã tìm thấy thứ chính xác mà tôi đang tìm kiếm, nhưng tôi vui vì tôi biết bây giờ nó không nằm trong lõi Node.
David Tang

5

Cách đơn giản nhất để chuyển đổi từ kiểu cũ sang kiểu mới (Express 3.x) là như sau:

var server = app.listen(8080);
console.log('Listening on port: ' + server.address().port);

Pre 3.x nó hoạt động như thế này:

/* This no longer works */
app.listen(8080);
console.log('Listening on port: ' + app.address().port);


3

Tôi cũng đã tự hỏi mình câu hỏi này, sau đó tôi đến trang hướng dẫn Express 4.x để xem mẫu này:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});

2
Nhưng tôi không biết tại sao địa chỉ server.address (). Luôn là 0.0.0.0 trên máy phát triển cục bộ (OSX) của tôi.
Tiến Đỗ

Điều này nên được thêm vào câu trả lời được chấp nhận vì Express 4.0 không còn coi app.listen () là một hoạt động đồng bộ và bạn cần chạy listener.address () trong cuộc gọi lại ngay bây giờ.
RavenHursT

3

Bạn có thể lấy số cổng bằng cách sử dụng server.address().port như trong đoạn mã dưới đây:

var http = require('http');
var serverFunction = function (req, res) {

    if (req.url == '/') {
        console.log('get method');
        res.writeHead(200, { 'content-type': 'text/plain' });
        res.end('Hello World');
    }

}
var server = http.createServer(serverFunction);
server.listen(3002, function () {
    console.log('server is listening on port:', server.address().port);
});

3
var express = require('express');    
var app = express();
    app.set('port', Config.port || 8881);
    var server = app.listen(app.get('port'), function() {
        console.log('Express server listening on port ' + server.address().port); 
    });

Nghe máy chủ tốc độ trên cổng 8881


2

Nếu bạn không xác định số cổng và bạn muốn biết cổng nào đang chạy.

let http = require('http');
let _http = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello..!')
}).listen();
console.log(_http.address().port);

FYI, mỗi lần nó sẽ chạy ở một cảng khác nhau.



-1

bên dưới một máy chủ http đơn giản và cách lấy cổng nghe

var http = require("http");
             function onRequest(request, response) {
               console.log("Request received.");
               response.writeHead(200, {"Content-Type": "text/plain"});
               response.write("Hello World");
               response.end();
             }

             var server =http.createServer(onRequest).listen(process.env.PORT, function(){
            console.log('Listening on port '); //Listening on port 8888
        });

sau đó lấy cổng máy chủ bằng cách sử dụng:

console.log('Express server started on port %s', server.address().port);

-1
const express = require('express');                                                                                                                           
const morgan = require('morgan')
const PORT = 3000;

morgan.token('port', (req) => { 
    return req.app.locals.port; 
});

const app = express();
app.locals.port = PORT;
app.use(morgan(':method :url :port'))
app.get('/app', function(req, res) {
    res.send("Hello world from server");
});

app1.listen(PORT);

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.