Node.js / Express.jsアプリはポート3000でのみ機能します


97

サーバーで実行されているNode.js / Express.jsアプリがポート3000でのみ動作し、その理由を理解しようとしています。これが私が見つけたものです:

  • ポート(app.listen())を指定しないと、アプリは実行されますが、Webページは読み込まれません。
  • ポート3001(app.listen(3001))または使用されていないその他のポートでは、アプリは実行されますが、Webページは読み込まれません。
  • 他の何かがそのポートを使用しているため、ポート2999でアプリはエラーをスローします。
  • ポート3000でアプリが実行され、ウェブページが正常に読み込まれます。

Expressアプリはデフォルトでポート3000に設定されています。しかし、奇妙なことに、私のアプリは、明示的にポート3000(app.listen(3000))で実行させた場合にのみ実行されます。

私はこれを220行目で見つけました/usr/bin/express

app.set(\'port\', process.env.PORT || 3000);

これは前述のとおりです。ポートを指定されたものに設定するか、何も指定されていない場合は3000に設定します。

8080や3001などの別のポートでアプリを動作させるにはどうすればよいですか?

ありがとう!

編集:コードサンプル(非常に単純なノード/ Expressアプリ)

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

app.get('/', function(req, res){
    res.send('hello world'); 
});

// Only works on 3000 regardless of what I set environment port to or how I set [value] in app.set('port', [value]).
app.listen(3000);

1)A portはによって必要とされる.listen()ので、これなしでは行かないでください。2)アプリケーションの実行時にエラーが発生していますか?それとも、ブラウザからアクセスできないように見えるだけですか?3)あなたが同じマシン上でWebサイトにアクセスしようとしているlocalhost:3000localhost:3001など?1台のクライアントと1台のサーバーの2台のマシンを使用している場合は、サーバーのファイアウォールに例外を追加して、ノードがクライアントからのリクエストを受信できるようにする必要があります。
Jonathan Lonowski 2013

アプリをどのように起動しますか?
2013

スクラブ/サニタイズされたバージョンを要点に入れられる可能性はありますか?
2013

@ジョナサン知っておくと良い.listen()。上記の「アプリの実行」は、「アプリの実行中にエラーは発生しません」と同じことです。「ウェブページがロードされない」と言うと、「ブラウザからアクセスできません」と同じことです。同じマシン(私のサーバー)からのすべてのアクセス。フィードバックをお寄せいただきありがとうございます。
ベンジャミンマーティン

1
@deitch私が使用しているとき、$ supervisor app.jsまたは$ PORT=[PORT] node app.js環境ポート変数を設定したいとき。コードサンプルを載せます。
ベンジャミンマーティン

回答:


118

app.jsにこのようなものがあれば、次のように動作します。

http.createServer(app).listen(app.get('port'),
  function(){
    console.log("Express server listening on port " + app.get('port'));
});

次のように、必要なポートを使用するようにコードを明示的にハードコードします。

app.set('port', process.env.PORT || 3000);

このコード手段は、環境変数に使用するポートを設定しPORTたりしている場合はundefined、次にリテラルに設定します3000

または、環境を使用してポートを設定します。環境を経由して、それを設定することの間のヘルプ描写するために使用されているPRODUCTIONし、DEVELOPMENT彼らのスペックだけでなく、内部Expressのコンフィグに応じてポートを設定し、また、サービスとしてのプラットフォームの多くは環境を使用しています。次の例では、環境のkey = valueペアを設定し、アプリを起動します。

$ PORT=8080 node app.js

コード例を参照すると、次のようなものが必要です。

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

// sets port 8080 to default or unless otherwise specified in the environment
app.set('port', process.env.PORT || 8080);

app.get('/', function(req, res){
    res.send('hello world');
});

// Only works on 3000 regardless of what I set environment port to or how I set
// [value] in app.set('port', [value]).
// app.listen(3000);
app.listen(app.get('port'));

2
これは本当に奇妙です。私は次のことを行いました:1. app.set()アプリ内にコードを入れ、3000を8080に変更しましたapp.listen(3000)。2.ノードアプリの実行時に、環境ポート変数を8080に変更します。まだ動作しapp.listen(3000)ます。3. / usr / bin / express(220行目)に移動し、3000を8080に変更しましたapp.listen(3000)。まだでのみ機能します。有益な投稿をありがとうございます。再起動する必要があるものはありますか?Expressは私が言うことができるものから再起動できず、Nodeアプリの再起動は使用するたびに発生しますnode app.js.
Benjamin Martin

@BenjaminMartin Expressは他のモジュールと同じようにモジュールにすぎないので、単純node app.jsに起動するだけです(私は個人的nodemonに開発とテストに使用します。あなたが考えているのは、expressスケルトンを構築するヘルパープロセスであるコマンドライン実行可能ファイルです。ファイル構造。コードの要旨を投稿できますか?
EhevuTov 2013

落とし穴。通常nodemon、と組み合わせて使用するのはnohup、アプリを無期限に実行し続けるためです。CL実行可能バージョンのをexpress使用していないため、nodeアプリを再起動するたびに再起動する必要があります。コードでの編集については、元の投稿を参照してください。ありがとう!
ベンジャミンマーティン

@BenjaminMartinが私の答えの一番下を確認し、そのコードを実行します。それはうまくいくはずです。私のマシンでテストしたところです。
EhevuTov 2013

これは、ポートを変更するもう1つの便利な方法ですが、ポートが3000の場合にのみ機能します。特定のポートでのみコンテンツを提供できるサーバー上に何かがあるのではないかと考え始めています。しかし、この構成がどこにあるかわかりません。これは問題でしょうか?参考までに、私はUbuntu 10.04を実行しています。
ベンジャミンマーティン

30

ではbin/www、行があります:

var port = normalizePort(process.env.PORT || '3000');

変更してみてください。


1
app.jsでポートを設定してみましたが、この行が上書きされていました。これは、ポートを変更するための正しい場所です。
Neil、

12

これを試して

$ PORT=8080 node app.js

1
答えてくれてありがとう-これは、app.js内にapp.listen(3000)を設定している場合にのみ機能します。つまり、アプリを実行するときにポートを設定しても、app.listen()はオーバーライドされないようです。
ベンジャミンマーティン

完璧です。私はエクスプレスで使用します:PORT = 8000 npm start。だからあなたはあなたが好きなものを使うことができます:D。
Johan Hoeksma 2015年


9

Expressフレームワークのリスニングポートを変更するデフォルトの方法は、binフォルダ内のwwwという名前のファイルを変更することです。

そこでは、次のような行があります

var port = normalizePort(process.env.PORT || '3000');

値3000を任意のポートに変更します。

これはExpressバージョン4.13.1に有効です


4

Mac OS XおよびLinuxユーザー向けの注意事項:

Node / Expressアプリを1024未満のポート番号で実行する場合は、スーパーユーザーとして実行する必要があります。 sudo PORT=80 node app.js


2
1024未満のポートでアプリを実行するためのより良いオプションは、より大きな番号のポートを転送することです。sudoを使用して1024未満のポート番号にアクセスできるようにすることは、一般に悪い習慣と見なされています。
Pieter VDE、2017年

4

express-generatorを使用した最新バージョンのコード(4.13.1)では、app.jsはエクスポートされたモジュールであり、サーバーはapp.set( 'port'、process.env.PORT || 3001)を使用して/ bin / wwwで起動されますapp.js内のbin / www内の同様のステートメントによってオーバーライドされます。bin / wwwのステートメントを変更しました。


2

これは解決されなかったことに気づきました...おそらくあなたのマシンの前にファイアウォールがそれらのポートをブロックしているか、それらのポートの使用を防ぐためにiptablesが設定されています。

アプリを実行するときにnmap -F localhostを実行してみてください(nmapがない場合はインストールします)。アプリを正しいポートで実行しているように見え、リモートブラウザー経由でアプリにアクセスできない場合は、ポートをブロックしているミドルウェアまたは物理ファイアウォールがあります。

お役に立てれば!


それが私にとってうまくいきました。ポートを許可するのを忘れました。
lalilulelost

2

見つけた行は、環境変数を探しPORTます3000。定義されている場合はそれを使用し、そうでない場合はデフォルトのポートを使用します。最初にこの環境変数を定義する必要があります(rootである必要はありません)

export PORT=8080
node <your-app.js>

2

3000に接続しているものを表示したい場合

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

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

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

お役に立てれば幸いです


1

Expressの現在のバージョンに応じて回答する

Express の現在のバージョンについて話す場合、実行app.listen()してポートを指定せずにリスニングを開始すると、Expressはアプリケーションのランダムなポートを選択し、現在使用中のポートを確認します。

app.listen(0, () => {
    console.log(app.address().port)
}

ポート出力する必要があります。さらに、その最初のパラメーターは完全に無視できますが、お勧めできませんapp0



0

私が使用していminimistたポートを制御するためのパッケージとノードの起動引数を。

node server.js --port 4000

または

node server.js -p 4000

server.js内では、ポートは

var argv = parseArgs(process.argv.slice(2))

const port = argv.port || argv.p || 3000;
console.log(`Listening on port ${port}...`)

//....listen(port);

引数としてポートが渡されない場合、デフォルトは3000です。

その後、port変数でlistenを使用できます。



0

最善の方法は、dotenvパッケージを使用して、フォルダー内の.envファイルを変更せずに構成ファイルにポートを設定することです。wwwbin

次のコマンドでパッケージをインストールするだけです:

npm install dotenv

あなたのアプリケーションでそれを必要とします:

require('dotenv').config()

プロジェクトのルートディレクトリに.envファイルを作成し、その中にポート(たとえば)を追加してポート5000でリッスンします。

PORT=5000

以上です。

詳細はこちら


0

Nodemonを使用している場合、私の推測では、portmonはnodemonConfigに設定されています。それが事実であるかどうか確認してください。

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