NodeJS:サーバーのポートを取得する方法?


142

Httpサーバーを作成し、ポートでリッスンを開始し、その後に次の行に沿って何かが続くNodeのサンプルhello worldコードをよく目にします。

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

しかし、理想的には代わりにこれが欲しいでしょう:

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

呼び出す前に変数に番号を保存せずに、サーバーが現在リッスンしているポートを取得するにはどうすればよいserver.listen()ですか?

これが以前に行われたのを見たことがありますが、Nodeのドキュメントでは見つかりません。多分それは表現するために特定のものですか?


3
検索場所req.headers.host
Andrew_1510

回答:


161

Express 4.xの回答:

Express 4.x(以下のTien Doの回答による)では、app.listen()を非同期操作として扱うため、listener.address()はapp.listen()のコールバック内のデータのみを返します。

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

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

Express 3の回答:

私はあなたがこれを探していると思います(具体的に表現しますか?):

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

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
ありがとう、私はまさにそれを探しています。テストする機会があり次第、それを受け入れます。乾杯。
David Tang

4
そして、その変数var listenerを使用したくない場合は、コールバックthis.address().port内で使用できapp.listen()ます
Andrei Stalbe '23年

これはExpress 5.xでどのように見えますか?
Diogenes 2017

2
ミドルウェアの任意の場所でポートを取得することもできます。req.socket.address()。port
jlguenego

@AndreiStalbeの発言に追加するだけで使用できますthis.address.port()が、アロー関数内では使用できません。あなたは古い学校をする必要がありますapp.listen(8000, function () { console.log('http://localhost:' + this.address().port); }(はい、私はバッククォートの方がいいことを知っていますが、スタックオーバーフローコメントではできません)
WORMSS

65

Express v3.0では、

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

動作しなくなりました!Express v3.0の場合、次の方法でアプリとサーバーを作成する必要があります。

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

私はこの問題に出くわし、新しい構文を文書化したいと思いました。これとExpress v3.0の他の変更は、https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.xで確認できます。


または、サーバーを作成する古い方法を使用することもできますが、それでも機能します。ポートのあとがきにアクセスする方法がなくなったようです。ただし、server.listenの呼び出しで自分でポートを指定しているので、server.listenに渡したのと同じ値を使用できるので、server.address()。portを使用する必要は実際にはありません。
メアリーハムリン

(私は移行ガイドを読んだだけで、上で述べたアプリとサーバーを作成する方法が実際に新しい推奨される方法であることがわかりました。)
Mary Hamlin '31

3
@MaryHamlin:あなたが合格している場合、これは便利です0server.listen()、その場合にはランダムなポート番号が割り当てられています。1つのサーバーで複数のExpressアプリを実行していて、手動でポート番号を割り当てたくない場合に、これを行うことがあります。
ネイト

app.listen()また、httpサーバーインスタンスを返します。
Vicary 2014年

23

現在のバージョン(v0.5.0-pre)では、ポートはサーバーオブジェクトのプロパティとして使用できるようです。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);

出力

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

22

リクエスト処理時にポートが必要でアプリが利用できない場合は、これを使用できます。

request.socket.localPort

17

エクスプレスを使用している場合は、リクエストオブジェクトから取得できます。

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

14

私はこのようにExpress 4を使用します。

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

これを使用することで、リスナー/サーバーに個別の変数を使用する必要がなくなります。


1
これまでのベストアンサー!ES6を使用している場合は、矢印関数を使用しないでください。this未定義になります。
Laxmana 2017

9

httpモジュールを要求する必要は決してありませんでした。

httpExpress 3または4では、の追加インポートは必要ありませんlisten()。結果の割り当てで十分です。

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

繰り返しますが、これはExpress 3.5.1および4.0.0でテストされています。インポートhttpは必要ありませんでした。listenメソッドは、httpサーバーオブジェクトを返します。 https://github.com/visionmedia/express/blob/master/lib/application.js#L531


6

最新のnode.js(v0.3.8-pre)を使用:ドキュメントを確認し、http.createServer()から返されたサーバーインスタンスを検査して、server.listen()のソースコードを読みました...

悲しいことに、ポートはローカル変数として一時的にのみ保存され、ネイティブメソッドであるprocess.binding( 'net')。bind()の呼び出しの引数として終了します。私はさらに調べませんでした。

server.listen()に提供したポート値への参照を保持する以外に方法はないようです。


1
+1、研究に感謝します。アルフレッドが私が探していたものとまったく同じものを見つけたので、私はアルフレッドの答えを受け入れますが、ノードコアにないことを知ってうれしいです。
David Tang

5

古いスタイルから新しい(Express 3.x)スタイルに変換する最も簡単な方法は次のとおりです。

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

3.xより前は次のように機能します。

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


3

私もこの質問をしていたところ、Express 4.xのガイドページアクセスしてこのサンプルを確認しました。

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

2
しかし、ローカル開発マシン(OSX)でserver.address()。addressが常に0.0.0.0である理由がわかりません。
Tien Do

Express 4.0はapp.listen()を同期操作として扱わなくなり、コールバックでlistener.address()を実行する必要があるため、これは受け入れられた回答に追加する必要があります。
RavenHursT 2015

3

server.address().port 以下のコードのように使用して、ポート番号を取得できます。

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でリッスンするExpressサーバー


2

ポート番号を定義せず、どのポートで実行されているかを知りたい場合。

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

ちなみに、別のポートで実行されるたびに。



-1

単純なhttpサーバーの下とリスニングポートを取得する方法

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

次に、次を使用してサーバーポートを取得します。

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

より簡単な方法は、を呼び出すapp.get('url')ことです。これにより、プロトコル、サブドメイン、ドメイン、およびポートが提供されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.