NodeJS: Sunucunun bağlantı noktası nasıl alınır?


142

Bir Http Sunucusu oluşturan, bir bağlantı noktasını dinlemeye başlayan ve ardından şu satırlarda bir şey izleyen Düğüm için genellikle merhaba dünya kodunu görürsünüz:

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

Ama ideal olarak bunun yerine şunu istersiniz:

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

Sunmadan önce sunucunun dinlediği bağlantı noktasını numarayı bir değişkene kaydetmeden nasıl alabilirim server.listen()?

Bunu daha önce yaptım ama Düğüm belgelerinde bulamıyorum. Belki bu ifade etmek için özel bir şeydir?


3
Bulunreq.headers.host
Andrew_1510

Yanıtlar:


161

4.x hızlı cevap:

Express 4.x (aşağıdaki Tien Do'nun cevabı başına), şimdi app.listen () öğesini eşzamansız bir işlem olarak ele alır, bu yüzden listener.address () yalnızca app.listen () öğesinin geri aramasının içindeki verileri döndürür:

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

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

Express 3 cevabı:

Bence bu (açık belirli?):

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

Komuttan dizin yapısı oluştururken bunu (en alt satırda) görmüş olabilirsiniz express:

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
Teşekkürler, tam da aradığım şey bu. Test etme şansım olduğunda kabul edeceğim. Şerefe.
David Tang

4
Ve bu değişkene sahip olmak istemiyorsanız geri arama içinde var listenerkullanabilirsinizthis.address().portapp.listen()
Andrei Stalbe

Express 5.x'te bu neye benziyor?
Diogenes

2
Bağlantı noktasını bir ara katman yazılımında herhangi bir yere de alabilirsiniz: req.socket.address (). Port
jlguenego

Sadece @AndreiStalbe'nin söylediklerine eklemek için kullanabilirsiniz, this.address.port()ancak bunu bir ok işlevi içinde kullanamazsınız. eski okul yapmak gerekecek app.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(evet, backticks güzel biliyorum, ama yığın taşma yorumlarında
yapamam

65

Express v3.0'da,

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

Artık çalışmıyor! Express v3.0 için şu şekilde bir uygulama ve sunucu oluşturmanız gerekir:

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

Bu konuya kendim girdim ve yeni sözdizimini belgelemek istedim. Bu ve Express v3.0'daki diğer değişiklikler https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x adresinde görülebilir.


Ya da, hala çalışan eski sunucu oluşturma yöntemini kullanabilirsiniz. Artık sözcükten sonra bağlantı noktasına erişmenin bir yolu yok gibi görünüyor. Ancak, server.listen çağrısında bağlantı noktasını kendiniz belirttiğiniz için, sadece server.listen'e ilettiğiniz değeri kullanabildiğiniz için gerçekten server.address (). Portunu kullanmaya gerek yoktur.
Mary Hamlin

(Her ne kadar geçiş kılavuzunu okudum ve yukarıda bahsettiğiniz bir uygulama ve sunucu oluşturma yönteminin aslında yeni tercih edilen yöntem olduğunu görmeme rağmen.)
Mary Hamlin

3
@MaryHamlin: Eğer geçiyoruz, bu yararlı olur 0üzere server.listen(), bu durumda rasgele bir port numarası atanır. Bir sunucuda birden fazla Express uygulaması çalıştırıyorsanız ve bağlantı noktası numaralarını manuel olarak atamak istemiyorsanız bunu yapabilirsiniz.
Nate

app.listen()http sunucusu örneğini de döndürür.
Vicary

23

Geçerli sürümde (v0.5.0-pre) bağlantı noktası sunucu nesnesinde bir özellik olarak kullanılabilir gibi görünüyor, bkz. 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);

çıktılar

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

22

İstek işleme sırasında bir bağlantı noktasına ihtiyacınız olduğunda ve uygulama kullanılamıyorsa, bunu kullanabilirsiniz:

request.socket.localPort

17

Express kullanıyorsanız, bunu istek nesnesinden alabilirsiniz:

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

14

Bu şekilde Express 4 kullanıyorum:

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

Bunu kullanarak dinleyici / sunucu için ayrı bir değişken kullanmam gerekmiyor.


1
Şimdiye kadarki en iyi cevap! ES6 kullanıyorsanız ok işlevlerini kullanmayın. thistanımsız olacak.
Laxmana

9

Http modülünü zorunlu kılmak hiç gerekmedi.

httpExpress 3 veya 4'te ek bir içe aktarma gerekli değildir. Sonucunun atanması listen()yeterlidir.

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

Yine, bu Express 3.5.1 ve 4.0.0'da test edilmiştir. İçe aktarma httphiç gerekmedi. Listen yöntemi bir http sunucusu nesnesi döndürür. https://github.com/visionmedia/express/blob/master/lib/application.js#L531


6

En son node.js (v0.3.8-pre) ile: Belgeleri kontrol ettim, http.createServer () tarafından döndürülen sunucu örneğini inceledim ve server.listen () kaynak kodunu okudum ...

Ne yazık ki, bağlantı noktası yalnızca geçici olarak yerel bir değişken olarak depolanır ve yerel bir yöntem olan process.binding ('net'). Bind () çağrısında bağımsız değişken olarak sonuçlanır. Daha fazla bakmadım.

Görünüşe göre server.listen () yöntemine sağladığınız bağlantı noktası değerine başvurmaktan daha iyi bir yol yoktur.


1
+1 ve araştırma için teşekkürler. Aradığınız şeyi bulduğu için Alfred'in cevabını kabul ediyorum, ama şimdi Düğüm çekirdeğinde olmadığını bildiğime sevindim.
David Tang

5

Eski stilden yeni (Express 3.x) stiline dönüştürmenin en basit yolu şudur:

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

Pre 3.x şu şekilde çalışır:

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


3

Ben de kendime bu soruyu soruyordum, sonra bu örneği görmek için Express 4.x kılavuz sayfasına geldim :

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

2
Ama neden server.address (). Adresini her zaman yerel geliştirme makinemde (OSX) 0.0.0.0 olduğunu bilmiyorum.
Tien Do

Express 4.0 artık app.listen () işlevini eşzamanlı işlem olarak işlemediğinden ve şimdi geri aramada listener.address () öğesini çalıştırmanız gerektiğinden, bu kabul edilen yanıta eklenmelidir.
RavenHursT

3

server.address().port Aşağıdaki koddaki gibi kullanarak port numarasını alabilirsiniz :

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

8881 numaralı bağlantı noktasında hızlı sunucu dinleme


2

Bağlantı noktası numarasını tanımlamadıysanız ve hangi bağlantı noktasında çalıştığını bilmek istiyorsanız.

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

FYI, her seferinde farklı bir limanda çalışacak.



-1

basit bir http sunucusunun altında ve dinleme bağlantı noktasının nasıl alınacağı

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

daha sonra şunu kullanarak sunucu bağlantı noktasını alın:

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

-2

Daha kolay yol, yalnızca app.get('url')protokolü, alt etki alanını, etki alanını ve bağlantı noktasını veren aramaktır.

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.