2017-10-26 6 views
2

app.get()app.use()の違いをよく理解したいと思っています。プロキシのapp.useとapp.get *の違い*

私はapp.useがすべてのHTTP動詞に適用されることを理解します。

私も...私はこの事実は、この動作が発生理由を理解したいという「app.use() adds middleware rather than a route

を読んだ私は、プロキシに反応開発用ウェブサーバーを必要とする特急APIサーバーを持っています。

これは、APIルートでないすべてのルートをプロキシする必要があることを意味します。

Iこのような代理ルート、それは動作します:

var proxy = require('express-http-proxy'); 

module.exports = function set_react_catchall_routes(app) { 
    /* Final route to send anything else to react server. */ 
    app.get('*', proxy('localhost:3000')); 
    app.post('*', proxy('localhost:3000')); 
} 

しかし、私はこれを行うとき、それは動作しません:

app.use('*', proxy('localhost:3000')); 

具体的には、「インデックス」ページがプロキシと提供しています

<body> 
    <div id="root"></div> 
    <script type="text/javascript" src="/static/js/bundle.js"></script> 
</body> 

クライアントはjavascript反応バンドルを要求しますgが起こる "。

ログされていないため、(GETとPOST以外の)動作しているときに「その他の」HTTPリクエストが含まれていないことは合理的に確信しています。

だから違いはありますか?

答えて

2

が上にこのログを入れてみてください、それは何が起こっているかを明確にするために役立つはずです。

app.use(function(req, res, next) { 
    // req.path will be '/static/js/bundle.js' 
    console.log('path1: ' + req.path); 

    next(); 
}); 

app.use('*', function(req, res, next) { 
    // req.path will be '/' 
    console.log('path2: ' + req.path); 

    next(); 
}); 

app.all('*', function(req, res, next) { 
    // req.path will be '/static/js/bundle.js' 
    console.log('path3: ' + req.path); 

    next(); 
}); 

あなたがapp.useを使用する場合には、req.pathの整合部を取り除きます。パスを指定しないと(ロギングセクション1)、何も外しません。同様に、セクション3はapp.allapp.getなど、すべて同じ方法で動作します)を使用していますが、req.pathのいずれも変更されません。それはキッカーですセクション2です。

これは、この例で考える起こる理由を理解するには:/user/profileapp.useパスの/user一部を取り除きますのためにリクエストが来たとき

var router = express.Router(); 

router.get('/profile', ...); 

app.use('/user', router); 

を。 routerまでは、パスはちょうど/profileです。ドキュメントを引用する

ミドルウェアから呼び出された場合、http://expressjs.com/en/4x/api.html#req.path

、マウントポイントはreq.pathには含まれていません。

app.useへのコールのパスは「開始」のようなビットで、一致するものはすべて破棄されます。すべて一致する*のため、すべてを捨てます。

express-http-proxyのソースコードを参照すると、req.pathを使用してプロキシ要求のパスが決定されます。 app.useをパスなしで使用するだけでうまくいくはずです。

そこは理解app.useと同様に関連する他のいくつかの要求プロパティは以下のとおりです。

  • req.urlreq.pathに似ていますが含まれたクエリ文字列です。 req.pathと同じように、によって削除されたmountpathに一致するセクションがあります。エクスプレスRequestは、ノードのhttp.IncomingMessageからurlプロパティを継承しているため、Expressドキュメントに明示的に記載されていません。
  • req.originalUrlは、req.urlと同じで始まりますが、app.useで変更されません。
  • req.baseUrlは、削除されたパスのセクションをapp.useで保存するために使用されます。

req.originalUrlthe documentationを参照してください。これらの3つのプロパティの詳細については、

+0

私が知る必要があったこと、明確に説明された、素晴らしいアウト、すばらしい答え! – GreenAsJade

関連する問題