私はnode.jsを表現するのが初めてなので、app.useとapp.getの違いを理解できません。両方を使用して情報を送信できるようです。例えば:
app.use('/',function(req, res,next) {
res.send('Hello');
next();
});
これと同じようです:
app.get('/', function (req,res) {
res.send('Hello');
});
私はnode.jsを表現するのが初めてなので、app.useとapp.getの違いを理解できません。両方を使用して情報を送信できるようです。例えば:
app.use('/',function(req, res,next) {
res.send('Hello');
next();
});
これと同じようです:
app.get('/', function (req,res) {
res.send('Hello');
});
回答:
app.use()
ミドルウェアをアプリケーションにバインドするためのものです。これpath
は「マウント」または「プレフィックス」パスであり、ミドルウェアを、それで始まる要求されたパスにのみ適用するように制限します。別のアプリケーションを埋め込むために使用することもできます。
// subapp.js
var express = require('express');
var app = modules.exports = express();
// ...
// server.js
var express = require('express');
var app = express();
app.use('/subapp', require('./subapp'));
// ...
/
「マウント」パスとして指定することにより、でapp.use()
始まるすべてのパスに応答します/
。これらはすべて、使用されるHTTP動詞に関係なく次のようになります。
GET /
PUT /foo
POST /foo/bar
app.get()
一方、Expressのアプリケーションルーティングの一部であり、GET
HTTP動詞で要求されたときに特定のルートを照合して処理することを目的としています。
GET /
そして、あなたの例の同等のルーティングapp.use()
は実際には次のようになります:
app.all(/^\/.*/, function (req, res) {
res.send('Hello');
});
(更新:違いをよりよく示すための試み)
を含むルーティングメソッドは、app.get()
リクエストへの応答をより正確に調整するのに役立つ便利なメソッドです。また、パラメーターやなどの機能のサポートも追加されますnext('route')
。
それぞれの中app.get()
でへの呼び出しが行われるapp.use()
ので、これらすべてをapp.use()
直接直接実行できます。しかし、そうすることは、多くの場合、(おそらく不必要に)さまざまな量のボイラープレートコードの再実装を必要とします。
例:
単純な静的ルートの場合:
app.get('/', function (req, res) {
// ...
});
対
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
// ...
});
同じルートに複数のハンドラがある場合:
app.get('/', authorize('ADMIN'), function (req, res) {
// ...
});
対
const authorizeAdmin = authorize('ADMIN');
app.use('/', function (req, res, next) {
if (req.method !== 'GET' || req.url !== '/')
return next();
authorizeAdmin(req, res, function (err) {
if (err) return next(err);
// ...
});
});
パラメータあり:
app.get('/item/:id', function (req, res) {
let id = req.params.id;
// ...
});
対
const pathToRegExp = require('path-to-regexp');
function prepareParams(matches, pathKeys, previousParams) {
var params = previousParams || {};
// TODO: support repeating keys...
matches.slice(1).forEach(function (segment, index) {
let { name } = pathKeys[index];
params[name] = segment;
});
return params;
}
const itemIdKeys = [];
const itemIdPattern = pathToRegExp('/item/:id', itemIdKeys);
app.use('/', function (req, res, next) {
if (req.method !== 'GET') return next();
var urlMatch = itemIdPattern.exec(req.url);
if (!urlMatch) return next();
if (itemIdKeys && itemIdKeys.length)
req.params = prepareParams(urlMatch, itemIdKeys, req.params);
let id = req.params.id;
// ...
});
注:これらの機能のExpressの実装は、その中に含まれている
Router
、Layer
とRoute
。
path-to-regexp
もう必要ないか、何でもあり、use
メソッドの最初の引数でルートパラメータを直接使用できます。
app.use
Expressが依存するミドルウェアフレームワークであるConnectの「低レベル」メソッドです。
これが私のガイドラインです:
app.get
GETメソッドを公開する場合に使用します。app.use
ミドルウェア(Expressで設定したルートに到着する前のHTTPリクエストのハンドラー)を追加する場合、またはルートをモジュール化する場合(たとえば、一連のルートを公開する場合)に使用します。他のWebアプリケーションが使用できるnpmモジュールから)。app.use
いくつかのルートを処理するために使用できますか?またはapp.use
、ルーティングに使用しないでください。
単にapp.useは「すべてのリクエストでこれを実行する」を意味しますapp.getは「
指定されたURLについて、GETリクエストでこれを実行する」を意味します
app.use
&の違いapp.get
:
app.use
→これは通常、アプリケーションにミドルウェアを導入するために使用され、すべてのタイプのHTTP要求を処理できます。
app.get
→GET HTTPリクエストを処理するためだけのものです。
現在、app.use
&の間には混乱がありapp.all
ます。間違いなく、それらにはすべての種類のHTTP要求を処理できるという共通点が1つあります。しかし、ミドルウェアにはapp.useを使用し、ルート処理にはapp.allを使用することを推奨するいくつかの違いがあります。
app.use()
→コールバックは1つだけです。
app.all()
→複数のコールバックを受け取ることができます。
app.use()
URLが指定されたパスで始まるかどうかのみを確認します。
しかし、app.all()
完全なパスに一致します。
例えば、
app.use( "/book" , middleware);
// will match /book
// will match /book/author
// will match /book/subject
app.all( "/book" , handler);
// will match /book
// won't match /book/author
// won't match /book/subject
app.all( "/book/*" , handler);
// won't match /book
// will match /book/author
// will match /book/subject
next()
内部で呼び出してapp.use()
次のミドルウェアや任意の経路ハンドラのいずれかを呼び出しますが、next()
コールの内部がapp.all()
(次のルートハンドラが呼び出されますapp.all()
、app.get/post/put...
のみなど)。後にミドルウェアがある場合はスキップされます。したがって、すべてのミドルウェアを常にルートハンドラーの上に置くことをお勧めします。next()
内部で呼び出すapp.all('/*', ...)
と、実際app.use('/', ...)
にはファイルの後半で実行されます。たぶん、あなたを誤解しました。そうでなければ非常に役立つ説明。
上記の説明に加えて、私が経験するもの:
app.use('/book', handler);
URLとして「/ book」で始まるすべてのリクエストに一致します。したがって、「/ book / 1」または「/ book / 2」にも一致します
app.get('/book')
完全一致の GETリクエストのみに一致します。「/ book / 1」や「/ book / 2」のようなURLは処理しません
したがって、すべてのルートを処理するグローバルハンドラーが必要な場合は、 app.use('/')
はがオプションです。app.get('/')
ルートURLのみを処理します。