306

質問する前にapp.router、少なくともミドルウェアを使用するときに何が起こると思うかを説明する必要があると思います。ミドルウェアを使用する場合、使用する関数はですapp.use()。ミドルウェアが実行されているときは、を使用して次のミドルウェアを呼び出すか、next()ミドルウェアが呼び出されないようにします。つまり、一部のミドルウェアは他のミドルウェアに依存しており、最後の方の一部のミドルウェアは呼び出されない可能性があるため、ミドルウェアを呼び出す順序が重要です。

今日、私は自分のアプリケーションで作業していて、サーバーをバックグラウンドで実行していました。いくつか変更を加えてページを更新し、変更をすぐに確認したかったのです。具体的には、レイアウトを変更していました。動作させることができなかったので、Stack Overflowで答えを検索し、この質問を見つけました。それexpress.static()が下にあることを確認するように言っていますrequire('stylus')。しかし、そのOPのコードを見ていたときapp.router、彼がミドルウェアの呼び出しの最後に呼び出しを行っているのを見て、それがなぜであるかを理解しようとしました。

Express.jsアプリケーション(バージョン3.0.0rc4)を作成したとき、コマンドを使用し、app.jsファイルで、上記のと呼び出しの両方express app --sessions --css stylusでコードがセットアップされました。したがって、すでにそのように設定されている場合は、そのままにしておく必要があるようです。app.routerexpress.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()は私の情報のキャッシュであり、アプリケーションが要求されたページを見つけられない場合は、キャッシュをチェックして存在するかどうかを確認します。

4

4 に答える 4

333

注:これは、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は、ルートを定義した時点でExpressによって暗黙的に追加されることに注意してください(これが、コメントアウトしてもルートが機能する理由ですapp.use(app.router))。


コメント投稿者は、私が対処しなかった順序について別のポイントを提起しました。それは、アプリの全体的なパフォーマンスへの影響です。staticrouter

use router上記のもう1つの理由staticは、パフォーマンスを最適化することです。最初に置くstaticと、ファイルが存在するかどうかを確認するために、すべてのリクエストでハードドライブにアクセスします。簡単なテストで、このオーバーヘッドは、アンロードされたサーバーで最大1ミリ秒に達することがわかりました。(その数は、要求がディスクアクセスをめぐって競合する負荷の下では、より高くなる可能性が非常に高くなります。)

routerまず、ルートに一致するリクエストがディスクにヒットする必要がないため、貴重なミリ秒が節約されます。

もちろん、staticのオーバーヘッドを軽減する方法はあります。

最良のオプションは、すべての静的リソースを特定のフォルダーに配置することです。(IE /static)次に、そのパスにマウントstaticして、パスが/static:で始まる場合にのみ実行されるようにすることができます。

app.use('/static', express.static(__dirname + '/static'));

この状況では、これを上に置きますrouter。これにより、ファイルが存在する場合に他のミドルウェア/ルーターを処理する必要がなくなりますが、正直なところ、それほど多くの利益が得られるとは思えません。

静的リソースをメモリ内にキャッシュするを使用することもできstaticCacheます。これにより、一般的に要求されるファイルをディスクにヒットする必要がなくなります。(警告:将来的には staticCache 削除されるようです。)

ただし、(ファイルが存在しない場合に)否定的な回答をキャッシュするとは思わないので、パスにマウントせずに上記をstaticCache配置した場合は役に立ちません。staticCacherouter

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


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の変更点についてもっと読む。

于 2012-10-02T18:09:13.343 に答える
3

ルーティングとは、アプリケーションが特定のエンドポイントへのクライアント要求にどのように応答するかを決定することを意味します。これは、URI(またはパス)と特定のHTTP要求メソッド(GET、POSTなど)です。各ルートには、ルートが一致したときに実行される1つ以上のハンドラー関数を含めることができます。

Express 4.0ルーターでは、ルートを定義する際にこれまで以上に柔軟性があります。

express.Router()は、ルートのグループを定義するために複数回使用されます。

リクエストを処理するためのミドルウェアとして使用されるルート。

「.param()」を使用してパラメータを検証するためのミドルウェアとして使用されるルート。

ルート上で複数のリクエストを定義するためのルーターへのショートカットとして使用されるapp.route()

app.route()を使用しているときは、そのルーターにアプリを接続しています。

var express = require('express'); //used as middleware
var app = express(); //instance of express.
app.use(app.router);
app.use(express.static(__dirname + '/public')); //All Static like [css,js,images] files are coming from public folder
app.set('views',__dirname + '/views'); //To set Views
app.set('view engine', 'ejs'); //sets View-Engine as ejs
app.engine('html', require('ejs').renderFile); //actually rendering HTML files through EJS. 
app.get('/', function (req, res) {
  res.render('index');  
})
app.get('/test', function (req, res) {
  res.send('test')
})
于 2016-11-04T17:21:17.953 に答える
1

Expressバージョン4では、次の方法でルートを簡単に定義できます。

server.js:

const express = require('express');
const app = express();
const route = require('./route');

app.use('/route', route);
// here we pass in the imported route object

app.listen(3000, () => console.log('Example app listening on port 3000!'));

route.js:

const express = require('express');
const router = express.Router();

router.get('/specialRoute', function (req, res, next) {
     // route is now http://localhost:3000/route/specialRoute
});

router.get('/', function (req, res, next) {
    // route is now http://localhost:3000/route
});

module.exports = router;

ここではserver.js、ファイルのルーターオブジェクトをインポートroute.jsし、次のように適用しますserver.js

app.use('/route', route);

これで、内のすべてのルートにroute.js次のベースURLが設定されます。

http:// localhost:3000 / route

このアプローチの理由:

このアプローチを採用する主な利点は、アプリがよりモジュール化されていることです。特定のルートのすべてのルートハンドラーを異なるファイルに配置できるようになりました。これにより、すべてがより保守しやすくなり、見つけやすくなります。

于 2018-09-12T07:54:21.663 に答える
0

モジュール性を実証することを目的とした2016年の@kelyvinnによる記事には、次のコードが含まれています。

// controllers/apis/dogs/index.js
const
    express = require('express'),
    dogService = require('../../../services/dogs');

let router = express.Router();

router.get('/', dogService.getDogs);
router.get('/:id', dogService.getDogWithId);

module.exports = router;

于 2020-08-17T16:50:47.680 に答える