express.Routerとapp.getの違いは?


265

私はNodeJSとExpress 4から始めていますが、少し混乱しています。ExpressのWebサイトを読んでいましたが、ルートハンドラーを使用するタイミングやを使用するタイミングがわかりませんexpress.Router

私が見ることができるように、/showたとえばユーザーがヒットしたときにページまたは何かを表示したい場合は、以下を使用する必要があります。

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

最初は、これは古いと思っていました(Express 3用)。それは正しいですか、これはExpress 4の方法でもありますか?

これがExpress 4でそれを行う方法である場合、何にexpress.Router使用されますか?

私は上記とほとんど同じ例を読みましたが、以下を使用していexpress.Routerます:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

では、両方の例の違いは何ですか?

単純なテスト用のWebサイトを作成したいだけの場合、どちらを使用すればよいですか?


27
A Router.listen()、それ自体の要求には対応していません。作成-これは、複数のモジュールにアプリケーションを分離するために有用だRouterというそれぞれにappすることができますrequire()し、.use()ミドルウェアとして。
Jonathan Lonowski、2015

5
@JonathanLonowskiがほのめかしたように、app.get(..)構文は操作をexpress.routerより便利にするためのショートカットにすぎません。始めたばかりの場合は、ルーターの詳細について心配する必要はありません。
soulprovidr 2015

1
だから今のところapp.get()だけを使うべきだと言ってるの?どちらを使用するかについてはまだ混乱しています
nelson687

11
@ nelson687それらの間に実際にハードセットのルールはありません。app'sなどの独自のルーティング方法でapp.get()十分だと思われる場合は、それらを使用してください。これRouterは、複数のモジュールにまたがってアプリケーションを整理するのに役立つ便利なものです。ガイドから:「クラスがモジュラーマウントルートハンドラを作成するために使用することができるAの。インスタンスが完全なミドルウェアおよびルーティングシステムである。このような理由のために、それは多くの場合と呼ばれている『ミニアプリ』。express.RouterRouter
ジョナサンLonowski

回答:


323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

ときvar app = express()に呼び出され、アプリケーションオブジェクトが返されます。これをメインアプリと考えてください。

ときvar router = express.Router()に呼び出され、わずかに異なるミニアプリが返されます。ミニアプリの背後にある考え方は、アプリの各ルートが非常に複雑になる可能性があるということです。そのため、すべてのコードを個別のファイルに移動することでメリットが得られます。各ファイルのルーターは、メインアプリと非常によく似た構造を持つミニアプリになります。

上記の例では、/ dogsルートのコードが独自のファイルに移動されているため、メインアプリが煩雑になることはありません。/ catsおよび/ birdsのコードは、独自のファイルでも同様に構成されます。このコードを3つのミニアプリに分離することで、それぞれのロジックを分離して作業でき、他の2つのアプリにどのように影響するかを気にする必要がありません。

3つのルートすべてに関係するコード(ミドルウェア)がある場合は、呼び出しの前にメインアプリに配置できapp.use(...)ます。これらのルートの1つにのみ関連するコード(ミドルウェア)がある場合は、そのルートのファイルにのみコードを配置できます。


app.use('/dogs', dogs)(app)ルートを定義しているので、アプリオブジェクトを渡す必要はありませんか?さらに、このようにすると、アプリオブジェクトにすべてのミドルウェアが以前に配置されている追加のミドルウェアがアプリオブジェクトに追加されます(より多くのミドルウェアがdogsルートにあると想定)。使用route.get('/dogs', route)する場合、そのルーターで定義されたルートと対話するときにミドルウェアをアプリオブジェクトに渡すだけで、アプリのスコープがルートの外にある場合、そのミドルウェアにアクセスできません。
2015年

1
ルートはでアプリに渡されるため、アプリをルートに渡す必要はありませんapp.use('/dogs', show)。この方法では、ルートはアプリから独立しており、どのExpressアプリでも再利用できます。ルートがそのルートで使用される前に配置されたミドルウェア。app.jsのすべてのルートの上にミドルウェアを配置すると、すべてのルートがそのミドルウェアを使用します。ルートファイル(dogs.js)内にミドルウェアを配置すると、そのルートのみがミドルウェアを使用します。dogs.js内のGETルートの後にミドルウェアを配置すると、POSTルートのみがそれを使用します(応答で終了する限り)。
Nocturno

ああ、私の悪い。app.get('/dogs'dogs,)(app)質問はapp.getとroute.getの取得機能に関するものだったので、私は置くつもりでした。ルートを分離して管理しやすくする方法を示していました。しかし、私たちが話しているのなら、私のアナコットは正しいのではないでしょうapp.getか?PCに乗れる場合は、上のコメントを編集します。
貪欲な2015年

2
私のアプリは、express.Router()またはexpress()のいずれかを使用してもまだ機能します。違いを理解できませんでした:(
Ajay Suwalka

3
@Ajay Suwalkaすでに言ったことについて、これ以上詳しく説明する方法がわかりません。ドキュメントには、「ルーターオブジェクトはミドルウェアとルートの分離されたインスタンスである」と書かれています。上記の@Jonathan Lonowskiのコメントも気に入っRouterてい.listen()ます。「A はそれ自体でリクエストを行うわけではありません」。それが主な違いかもしれません。
Nocturno 2016年

29

Express 4.0には新しいルーターが付属しています。サイトで述べたように:

express.Routerクラスを使用して、モジュール式のマウント可能なルートハンドラーを作成できます。ルーターインスタンスは、完全なミドルウェアおよびルーティングシステムです。このため、「ミニアプリ」と呼ばれることがよくあります。

https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4には、ルーターの違いと何ができるかを説明した優れた記事があります。

要約する

ルーターを使用すると、コードをより簡単にモジュール化できます。ルーターは次のように使用できます。

  1. 基本ルート:ホーム、概要
  2. ミドルウェアをルーティングしてリクエストをコンソールに記録する
  3. パラメータ付きルート
  4. 特定のパラメーターを検証するためのパラメーター用ミドルウェアのルーティング
  5. 特定のルートに渡されたパラメータを検証します

注意:

app.routerエクスプレス4で除去したオブジェクトは、それがアプリが明示的にロードしなければならなかったエクスプレス3、とは異なり、ベースExpressルータにだけ参照され、新しいバージョンでエクスプレス5に復帰してきました。


7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

上記の例のように、ルートの下に別のHTTPリクエストメソッドを追加できます。


5

アプリケーションが少し複雑だとしましょう。最初に行うことは、アプリケーションを複数のモジュールに分割して、1つのモジュールでの変更によって他のモジュールが乱雑にならないようにし、個々のモジュールで作業を続けることができるようにすることですが、結局、すべてを1つに統合する必要があります単一のアプリケーションを構築しています。1つのメインアプリケーションと、親がメインアプリケーションであるいくつかの子アプリケーションがあるようです。したがって、親アプリケーションを作成するときは、

var express = require('express');
var parent = express();

そして、この親アプリケーションに子アプリケーションを取り込む必要があります。しかし、子アプリケーションは完全に異なるアプリケーションではないため(同じcontext-java用語で実行されるため)、expressはExpresseのルーター機能でそれを実行する方法を提供します。これは、各子モジュールファイルとこのような子モジュールの1つをaboutmeとして呼び出します。

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

module.exportsによって、このモジュールを他のモジュールが使用できるようにします。モジュール化したものがあるため、他のサードパーティモジュールと同様に、ノードのrequire関数を使用してモジュールファイルを親アプリケーションで使用できるようにする必要があります。このようなもの。

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

この子モジュールを親が使用できるようにしたら、この子アプリケーションをいつ使用するかを親アプリケーションに通知する必要があります。ユーザーがパスaboutmeにアクセスしたときに、リクエストを処理するために私に関する子アプリケーションが必要であり、Expresseのuseメソッドを使用してそれを行うとしましょう。

parent.use('/aboutme',  aboutme);

一度に親ファイルは次のようになります

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

何よりも親ができることは、子ができないようにサーバーを起動できることです。これが明確になることを願っています。詳細については、常に時間のかかるソースコードを見ることができますが、多くの情報が得られます。ありがとうございました。


1
これはいけませんparent.use('/aboutme', child)か?
Kees de Kooter

2

ルートを書き込むためにapp.jsを使用するということは、アプリケーションの起動時にapp.jsがロードされるため、すべてのユーザーがルートにアクセスできることを意味します。ただし、ルートをexpress.router()ミニアプリに配置すると、それらのアクセシビリティが保護および制限されます。


2

express.Router 多くのオプションがあります:

  • 大文字と小文字の区別を有効にします。/showルートをと同じにしないでください/Show。この動作はデフォルトで無効になっています
  • 厳密なルーティングモード:と/show/は異なるルートにルーティングします。/showこの動作もデフォルトで無効になっています
  • 特定のミドルウェアを特定のルートに追加できます

0

つまり、ミドルウェアなどexpress.Routerと比較するとapp.get()、より多くのことができます。さらに、express.Router()

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