質問する前にapp.router
、少なくともミドルウェアを使用するときに何が起こると思うかを説明する必要があると思います。ミドルウェアを使用する場合、使用する関数はapp.use()
です。ミドルウェアが実行されているときは、を使用して次のミドルウェアを呼び出すか、next()
ミドルウェアが呼び出されないようにします。つまり、一部のミドルウェアは他のミドルウェアに依存しており、最後の方のミドルウェアは呼び出されない可能性があるため、ミドルウェアを呼び出す順序が重要です。
今日、私は自分のアプリケーションで作業していて、サーバーをバックグラウンドで実行していました。いくつか変更を加えてページを更新し、変更をすぐに確認したかったのです。具体的には、レイアウトを変更していました。動作させることができなかったので、Stack Overflowで答えを検索し、この質問を見つけました。それexpress.static()
が下にあることを確認するように言っていますrequire('stylus')
。しかし、そのOPのコードを見ていたapp.router
とき、彼がミドルウェア呼び出しの最後に呼び出しを行っているのを見て、それがなぜであるかを理解しようとしました。
Express.jsアプリケーション(バージョン3.0.0rc4)を作成したとき、コマンドを使用express app --sessions --css stylus
し、app.jsファイルで、app.router
上記のexpress.static()
とrequire('stylus')
呼び出しの両方でコードがセットアップされました。したがって、すでにそのように設定されている場合は、そのままにしておく必要があるようです。
スタイラスの変更を確認できるようにコードを再配置すると、次のようになります。
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
そのため、最初のステップはapp.router
、コードに含めることが重要である理由を見つけることであると判断しました。それで、コメントアウトしてアプリを起動し、に移動しました/
。それは私のインデックスページをうまく表示しました。うーん、ルートファイル(routes.index)からルーティングをエクスポートしていたので、うまくいったかもしれません。次に、に移動する/test
と、画面に「テスト」と表示されました。ハハ、わかりました、私は何をするのか分かりapp.router
ません。それが私のコードに含まれているかどうかにかかわらず、私のルーティングは問題ありません。だから私は間違いなく何かが欠けています。
だからここに私の質問があります:
誰かがそれを何をするのかapp.router
、それの重要性、そしてミドルウェア呼び出しのどこに置くべきかを説明してもらえますか?について簡単に説明してもらえたら嬉しいですexpress.static()
。私の知る限り、これexpress.static()
は私の情報のキャッシュであり、アプリケーションが要求されたページを見つけられない場合は、キャッシュをチェックして存在するかどうかを確認します。
注:これは、Expressがバージョン2および3でどのように機能したかを説明しています。Express4については、この投稿の最後を参照してください。
static
ディスクからファイル(静的リソース)を提供するだけです。パス(マウントポイントと呼ばれることもあります)を指定すると、そのフォルダー内のファイルが提供されます。
たとえばexpress.static('/var/www')
、そのフォルダ内のファイルを提供します。したがって、ノードサーバーへのリクエストhttp://server/file.html
はに役立ち/var/www/file.html
ます。
router
ルートを実行するコードです。を実行app.get('/user', function(req, res) { ... });
すると、router
実際にコールバック関数を呼び出してリクエストを処理します。
渡すapp.use
順序によって、各ミドルウェアに要求を処理する機会が与えられる順序が決まります。たとえばtest.html
、静的フォルダとルートに呼び出されたファイルがある場合:
app.get('/test.html', function(req, res) {
res.send('Hello from route handler');
});
どちらが要求しているクライアントに送信されますhttp://server/test.html
か?どちらのミドルウェアがuse
最初に与えられても。
これを行う場合:
app.use(express.static(__dirname + '/public'));
app.use(app.router);
次に、ディスク上のファイルが提供されます。
逆にすると、
app.use(app.router);
app.use(express.static(__dirname + '/public'));
次に、ルートハンドラーがリクエストを取得し、「Hellofromroutehandler」がブラウザーに送信されます。
通常、誤って名前が付けられたファイルがルートの1つを上書きできないように、ルーターを静的ミドルウェアの上に配置する必要があります。
あなたが明示的にいない場合ことを注意、それは暗黙のうちにあなたが(あなたのルートがまだ働いていた、なぜあなたはコメントアウトにもかかわらず、あるルートを定義する時点でエクスプレスによって追加されます)。use
router
app.use(app.router)
コメンターがいる育ての順序については、別のポイントstatic
とrouter
、アプリケーションの全体的なパフォーマンスに影響を与える:私は対処していなかったことを。
use
router
上記のもう1つの理由static
は、パフォーマンスを最適化することです。static
最初に置くと、ファイルが存在するかどうかを確認するために、すべてのリクエストでハードドライブにアクセスします。では簡単なテスト、私は、このオーバーヘッドが無負荷のサーバー上の〜1msのに達したことがわかりました。(その数は、要求がディスクアクセスをめぐって競合する負荷の下では、より高くなる可能性が非常に高くなります。)
ではrouter
まず、ルートに一致する要求は、貴重なミリ秒を保存する、ディスクをヒットする必要がありません。
もちろん、static
のオーバーヘッドを軽減する方法はあります。
最良のオプションは、すべての静的リソースを特定のフォルダーに配置することです。(IE /static
)次にstatic
、そのパスにマウントして、パスが/static
:で始まる場合にのみ実行されるようにすることができます。
app.use('/static', express.static(__dirname + '/static'));
この状況では、これを上に置きますrouter
。これにより、ファイルが存在する場合に他のミドルウェア/ルーターの処理が回避されますが、正直なところ、それほど多くの利益が得られるとは思えません。
staticCache
静的リソースをメモリ内にキャッシュするを使用することもできます。これにより、一般的に要求されるファイルをディスクにヒットする必要がなくなります。(警告: 将来的にはstaticCache
削除されるようです。)
ただし、staticCache
(ファイルが存在しない場合)否定的な回答をキャッシュするとは思わないので、パスにマウントせずにstaticCache
上記に配置した場合は役に立ちませんrouter
。
パフォーマンスに関するすべての質問と同様に、実際のアプリ(負荷がかかっている状態)を測定およびベンチマークして、ボトルネックが実際にどこにあるかを確認します。
Express4.0はを削除し app.router
ます。すべてのミドルウェア(app.use
)とルート(app.get
et al)は、追加された順序で正確に処理されるようになりました。
言い換えると:
すべてのルーティング方法は、表示される順序で追加されます。あなたはすべきではありません
app.use(app.router)
。これにより、Expressで最も一般的な問題が解消されます。言い換えると、ミキシング
app.use()
とapp[VERB]()
は、呼び出された順序で正確に機能します。app.get('/', home); app.use('/public', require('st')(process.cwd())); app.get('/users', users.list); app.post('/users', users.create);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加