Httpサーバーを作成し、ポートでリッスンを開始し、その後に次の行に沿って何かが続くNodeのhello worldコードの例をよく見ます。
console.log('Server is listening on port 8000');
しかし、理想的には代わりにこれが欲しいでしょう:
console.log('Server is listening on port ' + server.port);
server.listen()
を呼び出す前に変数に番号を保存せずにサーバーが現在リッスンしているポートを取得するにはどうすればよいですか?
これは以前に行ったことがありますが、Nodeのドキュメントにはありません。たぶん、それは表現するのに特有なものでしょうか?
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)
}
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 で確認できます
現在のバージョン(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
エクスプレスを使用している場合は、リクエストオブジェクトから取得できます。
req.app.settings.port // => 8080 or whatever your app is listening at.
リクエスト処理時にポートが必要でアプリが利用できない場合、これを使用できます:
request.socket.localPort
この方法でExpress 4を使用します。
app.listen(1337, function(){
console.log('Express listening on port', this.address().port);
});
これを使用することにより、リスナー/サーバーに個別の変数を使用する必要がなくなります。
httpモジュールを要求することは決して必要ではありませんでした。
Express 3または4では、http
を追加インポートする必要はありません。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
最新のnode.js(v0.3.8-pre)の場合:ドキュメントを確認し、http.createServer()によって返されたサーバーインスタンスを検査し、server.listen()のソースコードを読み取りました...
悲しいことに、ポートは一時的にローカル変数としてのみ保存され、ネイティブメソッドであるprocess.binding( 'net')。bind()の呼び出しの引数として終わります。私はこれ以上見ませんでした。
Server.listen()に提供したポート値への参照を保持するよりも良い方法はないようです。
古いスタイルから新しい(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);
req.headers.Host.split(':')[1]
以下のコードのように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);
});
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 4.xガイドページ に来ました。
var server = app.listen(3000, function() {
console.log('Listening on port %d', server.address().port);
});
ポート番号を定義しておらず、どのポートで実行されているかを知りたい場合。
let http = require('http');
let _http = http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello..!')
}).listen();
console.log(_http.address().port);
参考までに、異なるポートで実行されるたびに。
findandbind
npmは、express/restify/connectでこれに対処します: https://github.com/gyllstromk/node-find-and-bind