Expressのapp.use()とrouter.use()の違い


92

私はちょうど急行のドキュメントを読み、これら二つの用語を見つけ、たapp.use();router.use();

ミドルウェアapp.use();マウントするためのノードで使用されていることを知っていますパスにますが、ほとんどのノードアプリでよく使用されます。しかし、router.use();それらは両方とも同じですか?そうでない場合、違いは何ですか?

ここでルーターについて読みました。SOでも同様の質問を見つけました。「express.Router」と「app.get」を使用したルーティングの違いは何ですか? そして、app.allの差(「*」)とapp.use(「/」)が、彼らは本当に私の質問に答えていません。ありがとう。

回答:


126

router.getサブパスを定義するためだけのものです。この例を考えてみましょう。

var router = express.Router();

app.use('/first', router); // Mount the router as middleware at path /first

router.get('/sud', smaller);

router.get('/user', bigger);
  • / first / sudを開くと、smaller関数が呼び出されます。
  • / first / userを開くと、bigger関数が呼び出されます。

つまり、app.use('/first', router)ミドルウェアをパス/ firstにマウントし、それにrouter.get応じてサブパスを設定します。


しかし、代わりに以下を使用する場合:

app.use('/first', fun);

app.get('/sud', bigger);

app.get('/user', smaller);
  • ブラウザで/ firstを開くfunと、呼び出され、
  • /シュッドbigger呼び出されます
  • 以下のために/ユーザーsmaller呼び出されます

ただし、/ first / sudについては、関数が呼び出されないことを忘れないでください。

このリンクも役立つ場合があります:http//expressjs.com/api.html#router


私は私の答えを編集しました@NaeemShaikhplsは見直しています。
Sudhanshu Gaur 2015

4
しかし、app.use( '/ first / sud'、smaller);に移動できるのに、なぜルーターを使用するのでしょうか。およびapp.use( '/ first / user'、bigger)?つまり、最初のパラメーターに余分なものを入力する必要がないように、ルーターを作成したのでしょうか。
mskw 2015

いい質問に見えますが、正しくはわかりませんが、これは実際にルーティングが行われたものであり、app.useがミドルウェア用に作成されているURLで、app.use( '/ first / sud'、smaller);を使用できるようになっています。ただし、アプリに/ first / second / third / fourthで始まるルートが多数あるとします。ここで、すべてのルートを/ first / second / third / fourth / xにします。ここではルーターを使用しません。どちらも正常に機能しますが、ルーターこれらのURLの目的のためだけに作成されました
Sudhanshu Gaur 2015

つまり、を使用してネストを行うことはできませんrouter。でしかできませんapp。あれは正しいですか?
Mr_Perfect 2018年

1
OPが質問するのはなぜですか?router.useしかし、この回答は参照して応答しrouter.getますか?
TimHeilman20年

74

router.use();特定のルーターがサービスを提供するルートにミドルウェアをマウントしapp.use();、アプリのすべてのルート(または使用する場合は指定されたルートに一致するルートapp.use('/ANYROUTESHERE', yourMiddleware());)にミドルウェアをマウントします。

ユースケースの例としては、標準ルートを持つ1つのルーターと、有効なユーザーを必要とするAPIルートを処理する1つのルーターを備えたアプリがあります。

次に、APIルーターの認証ミドルウェアをrouter.use(yourAuthMiddleware());。のみでマウントします。

すべてのルートに有効なユーザーが必要なアプリがある場合は、アプリのミドルウェアを次のようにマウントします。 app.use(yourAuthMiddleware());


新しいルーターを作成してuseから、別のルーターで作成できますか?いいねrouter1.use('/path', router2);
CodyBugstein 2015年

6
この答えは明確であり、受け入れられる答えでなければなりません。ルーターは、アプリがより適切な場所で誤用されることがよくあります。
AturSams 2017

1

app.use()を使用して、指定されたパスにミドルウェア関数をマウントします。ミドルウェア関数は、要求されたパスのベースがパスと一致したときに実行されます。

router.use()は、ミドルウェア関数に使用されます。デフォルトのマウントパスは「/」です。

ただし、app.use()では、次のような指定されたパスを指定する必要があります。

 var adsRouter = require('./adsRouter.js');
    app.use('/ads', adsRouter);

または

app.use('/ads', function(req, res, next) {

  // write your callback code here.

    });

ただし、router.use()を使用している間は、次のようなミドルウェアのみを指定できます。

router.use(function(req, res, next) {
  console.log('%s %s %s', req.method, req.url, req.path);
  next();
});

または

router.use('/test', function(req, res, next) {
  // write your callback code here.
  next();
});

または

//in router.js

router.use('/admin', authUtil.verifySessionId, authUtil.verifyLisencee);
router.post('/admin', controllerIndex.ads.adListingAdmin);

上記のコードでは、エンドポイントが「/ admin」の場合、最初にauthUtil.verifySessionIdとauthUtil.verifyLisenceeを呼び出し、次に「admin」エンドポイントを使用してcontrollerIndex.ads.adListingAdminメソッドに従って次の行を実行します。


1
app.useアプリに対して行われたすべてのリクエストに対して関数を実行する場合は、パスを指定する必要はありません。
jacefarm 2018

@shubhamあなたはとてもよく説明してくれて、とても助かりました。ミドルウェアを備えたルーターの場合、router.delete( "/:id / delete"、middleware.checkToken、userController.deleteUser)のように1行にマージすることもできます
SourabhBhutani19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.