Node.js / Express.js-app.routerはどのように機能しますか?

オースト

質問する前に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()は私の情報のキャッシュであり、アプリケーションが要求されたページを見つけられない場合は、キャッシュをチェックして存在するかどうかを確認します。

josh3736

注:これは、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つを上書きできないように、ルーターを静的ミドルウェアのに配置する必要があります。

あなたが明示的にいない場合ことを注意、それは暗黙のうちにあなたが(あなたのルートがまだ働いていた、なぜあなたはコメントアウトにもかかわらず、あるルートを定義する時点でエクスプレスによって追加されます)。userouterapp.use(app.router)


コメンターがいる育ての順序については、別のポイントstaticrouter、アプリケーションの全体的なパフォーマンスに影響を与える:私は対処していなかったことを。

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

パフォーマンスに関するすべての質問と同様に、実際のアプリ(負荷がかかっている状態)を測定およびベンチマークして、ボトルネックが実際にどこにあるかを確認します。


Express 4

Express4.0はを削除し app.routerます。すべてのミドルウェア(app.use)とルート(app.getet 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);

Express4での変更点の詳細をご覧ください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Express Hapi.js Restfy Koa app.listen()およびapp.get()はどのように機能しますか?

分類Dev

Node.js + Expressアプリケーションで並行性はどのように機能しますか?

分類Dev

Node.js / Express.js - How does app.router work?

分類Dev

node.js-Busboyは実際にどのように機能しますか?

分類Dev

node.jsのrequire()はどのように機能しますか?

分類Dev

Node.jsストリームはどのように機能しますか?

分類Dev

app.set('views', __dirname + '/views') in Express & node.js

分類Dev

How to convert Markdown to HTML in Node.js / Express / MongoDB app

分類Dev

node.js / expressにhttp.createServer(app)が必要

分類Dev

Expressとnode.jsのapp.set( 'views'、__ dirname + '/ views')

分類Dev

コアnode.jsのexpress.js「app.use()」に相当するものは何ですか?

分類Dev

Registerhelper in node js express hbs

分類Dev

Node js(Express)express.staticが機能していません

分類Dev

App Engine StandardのNode.JSはクラッシュをどのように処理しますか?

分類Dev

node.jsの構成可能なロガーはどのように機能しますか?

分類Dev

Node.js Express middleware: app.param vs app.use

分類Dev

Node.jsでreactorパターンはどのように機能しますか?

分類Dev

node.jsクラスタリングはどのように機能しますか?

分類Dev

Node.js:Expressが機能していませんか?

分類Dev

node.js/express: use router.route() with middleware functions

分類Dev

Node.jsサーバー(Expressなど)は、PHPサーバーとは対照的にどのようにメモリを管理しますか?

分類Dev

Node.jsのExpressを使用したSEO

分類Dev

Node JS:Expressの使用を開始する

分類Dev

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

分類Dev

Node.js / Expressで新しいURLに再送するにはどうすればよいですか?

分類Dev

node.js / expressの文字列の制限

分類Dev

AJAX Post と Node.js Express の使用

分類Dev

Node.js + Express app in Azure hits 500 errors that fix themselves

分類Dev

node.js + expressで発信者のIPを取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    Express Hapi.js Restfy Koa app.listen()およびapp.get()はどのように機能しますか?

  2. 2

    Node.js + Expressアプリケーションで並行性はどのように機能しますか?

  3. 3

    Node.js / Express.js - How does app.router work?

  4. 4

    node.js-Busboyは実際にどのように機能しますか?

  5. 5

    node.jsのrequire()はどのように機能しますか?

  6. 6

    Node.jsストリームはどのように機能しますか?

  7. 7

    app.set('views', __dirname + '/views') in Express & node.js

  8. 8

    How to convert Markdown to HTML in Node.js / Express / MongoDB app

  9. 9

    node.js / expressにhttp.createServer(app)が必要

  10. 10

    Expressとnode.jsのapp.set( 'views'、__ dirname + '/ views')

  11. 11

    コアnode.jsのexpress.js「app.use()」に相当するものは何ですか?

  12. 12

    Registerhelper in node js express hbs

  13. 13

    Node js(Express)express.staticが機能していません

  14. 14

    App Engine StandardのNode.JSはクラッシュをどのように処理しますか?

  15. 15

    node.jsの構成可能なロガーはどのように機能しますか?

  16. 16

    Node.js Express middleware: app.param vs app.use

  17. 17

    Node.jsでreactorパターンはどのように機能しますか?

  18. 18

    node.jsクラスタリングはどのように機能しますか?

  19. 19

    Node.js:Expressが機能していませんか?

  20. 20

    node.js/express: use router.route() with middleware functions

  21. 21

    Node.jsサーバー(Expressなど)は、PHPサーバーとは対照的にどのようにメモリを管理しますか?

  22. 22

    Node.jsのExpressを使用したSEO

  23. 23

    Node JS:Expressの使用を開始する

  24. 24

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

  25. 25

    Node.js / Expressで新しいURLに再送するにはどうすればよいですか?

  26. 26

    node.js / expressの文字列の制限

  27. 27

    AJAX Post と Node.js Express の使用

  28. 28

    Node.js + Express app in Azure hits 500 errors that fix themselves

  29. 29

    node.js + expressで発信者のIPを取得するにはどうすればよいですか?

ホットタグ

アーカイブ