NodeJS: Bagaimana cara mendapatkan port server?

142

Anda sering melihat contoh halo kode dunia untuk Node yang menciptakan Server Http, mulai mendengarkan pada port, kemudian diikuti oleh sesuatu di sepanjang baris:

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

Tetapi idealnya Anda menginginkan ini sebagai gantinya:

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

Bagaimana cara mengambil port yang sedang didengarkan server tanpa menyimpan nomor dalam variabel sebelum menelepon server.listen()?

Saya telah melihat ini dilakukan sebelumnya tetapi saya tidak dapat menemukannya di dokumentasi Node. Mungkin itu sesuatu yang spesifik untuk diungkapkan?

David Tang
sumber
3
Temukan direq.headers.host
Andrew_1510

Jawaban:

161

Ekspresikan 4.x jawaban:

Express 4.x (sesuai jawaban Tien Do di bawah), sekarang memperlakukan app.listen () sebagai operasi tidak sinkron, jadi listener.address () hanya akan mengembalikan data di dalam callback app.listen ():

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

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

Mengungkapkan 3 jawaban:

Saya pikir Anda mencari ini (spesifik ekspres?):

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

Anda mungkin telah melihat ini (garis bawah), ketika Anda membuat struktur direktori dari expressperintah:

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)
}
Alfred
sumber
1
Terima kasih, saya pikir itulah yang saya cari. Saya akan menerimanya begitu saya mendapat kesempatan untuk mengujinya. Bersulang.
David Tang
4
Dan jika Anda tidak ingin memiliki variabel var listeneryang dapat Anda gunakan this.address().portdi dalam app.listen()callback
Andrei Stalbe
Seperti apa tampilan ini di Express 5.x?
Diogenes
2
Anda juga bisa mendapatkan porta di mana saja di middleware: req.socket.address (). Port
jlguenego
Hanya untuk menambahkan apa yang dikatakan @AndreiStalbe, Anda dapat menggunakan this.address.port()tetapi Anda tidak dapat menggunakannya di dalam fungsi panah. Anda perlu melakukan old school app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(ya, saya tahu backtick lebih bagus, tapi saya tidak bisa melakukannya di stack overflow comments)
WORMSS
65

Dalam v3.0 ekspres,

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

tidak lagi berfungsi! Untuk Express v3.0, Anda harus membuat aplikasi dan server dengan cara ini:

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);

Saya berlari ke masalah ini sendiri dan ingin mendokumentasikan sintaks baru. Perubahan ini dan lainnya dalam Express v3.0 dapat dilihat di https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x

dgh
sumber
Atau Anda bisa menggunakan metode lama untuk membuat server, yang masih berfungsi. Sepertinya tidak ada lagi cara untuk mengakses kata penutup port. Namun, karena Anda menentukan port sendiri di panggilan ke server.listen, sebenarnya tidak perlu menggunakan port server.address ()., Karena Anda bisa menggunakan nilai yang sama dengan yang Anda masukkan ke server.listen.
Mary Hamlin
(Meskipun saya baru saja membaca panduan migrasi dan melihat bahwa metode untuk membuat aplikasi dan server yang Anda sebutkan di atas sebenarnya adalah metode yang lebih disukai.)
Mary Hamlin
3
@MaryHamlin: Ini berguna jika Anda lewat 0untuk server.listen(), dalam hal nomor port acak ditugaskan. Anda mungkin melakukan ini jika Anda menjalankan beberapa aplikasi Express pada satu server dan Anda tidak ingin menetapkan nomor port secara manual.
Nate
app.listen()juga mengembalikan contoh server http.
Vicary
23

Dalam versi saat ini (v0.5.0-pre) port tampaknya tersedia sebagai properti pada objek server, lihat 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);

output

{ address: '0.0.0.0', port: 8088 }
0.0.0.0
8088
Jörn Horstmann
sumber
22

Jika Anda membutuhkan port pada saat penanganan permintaan dan aplikasi tidak tersedia, Anda dapat menggunakan ini:

request.socket.localPort
pengguna3348991
sumber
17

Jika Anda menggunakan express, Anda bisa mendapatkannya dari objek permintaan:

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

Saya menggunakan cara ini Express 4:

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

Dengan menggunakan ini saya tidak perlu menggunakan variabel terpisah untuk pendengar / server.

Christian Landgren
sumber
1
Jawaban terbaik sejauh ini! Jika Anda menggunakan ES6, jangan gunakan fungsi panah. thisakan tidak terdefinisi.
Laxmana
9

Membutuhkan modul http tidak pernah diperlukan.

Impor tambahan httptidak diperlukan dalam Express 3 atau 4. Menetapkan hasil listen()sudah cukup.

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

Sekali lagi, ini diuji dalam Express 3.5.1 & 4.0.0. Mengimpor httptidak pernah perlu. Metode mendengarkan mengembalikan objek server http. https://github.com/visionmedia/express/blob/master/lib/application.js#L531

james_womack
sumber
6

Dengan node.js terbaru (v0.3.8-pre): Saya memeriksa dokumentasi, memeriksa contoh server yang dikembalikan oleh http.createServer (), dan membaca kode sumber server.listen () ...

Sayangnya, port hanya disimpan sementara sebagai variabel lokal dan berakhir sebagai argumen dalam panggilan ke process.binding ('net') .bind () yang merupakan metode asli. Saya tidak melihat lebih jauh.

Tampaknya tidak ada cara yang lebih baik daripada menyimpan referensi ke nilai port yang Anda berikan ke server.listen ().

Eric Bréchemier
sumber
1
+1 dan terima kasih atas penelitiannya. Saya menerima jawaban Alfred karena dia menemukan hal yang tepat yang saya cari, tetapi saya senang saya tahu itu tidak ada di inti Node sekarang.
David Tang
5

Cara paling sederhana untuk mengonversi dari gaya lama ke gaya baru (Express 3.x) adalah seperti ini:

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

Pra 3.x kerjanya seperti ini:

/* This no longer works */
app.listen(8080);
console.log('Listening on port: ' + app.address().port);
Waylon Flinn
sumber
5
req.headers.host.split(':')[1]
RockerFlower
sumber
3

Saya juga bertanya pada diri sendiri pertanyaan ini, lalu saya datang ke halaman panduan Express 4.x untuk melihat contoh ini:

var server = app.listen(3000, function() {
   console.log('Listening on port %d', server.address().port);
});
Tien Do
sumber
2
Tapi saya tidak tahu mengapa alamat server.address () selalu 0.0.0.0 di mesin pengembangan lokal saya (OSX).
Tien Do
Ini harus ditambahkan ke jawaban yang diterima karena Express 4.0 tidak lagi memperlakukan app.listen () sebagai operasi yang sinkron dan Anda perlu menjalankan listener.address () di callback sekarang.
RavenHursT
3

Anda bisa mendapatkan nomor port dengan menggunakan server.address().port seperti dalam kode di bawah ini:

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);
});
Shubham Verma
sumber
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); 
    });

Server ekspres mendengarkan pada port 8881

KARTHIKEYAN.A
sumber
2

Jika Anda tidak menentukan nomor port dan Anda ingin tahu di port mana ia berjalan.

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

FYI, setiap kali itu akan berjalan di port yang berbeda.

Syekh
sumber
-1

di bawah server http sederhana dan cara mendapatkan port mendengarkan

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
        });

kemudian dapatkan port server dengan menggunakan:

console.log('Express server started on port %s', server.address().port);
Badr Bellaj
sumber
-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);
zurgl
sumber
-2

Cara yang lebih mudah adalah dengan menelepon app.get('url'), yang memberi Anda protokol, sub domain, domain, dan port.

Downhillski
sumber