Node.js で実行されている Express.jsapp.all("*", … )
との間に有用な違いはありますか?app.use("/", … )
7 に答える
app.useはコールバック関数を 1 つだけ取り、ミドルウェア向けです。ミドルウェアは通常、リクエストとレスポンスを処理しません (技術的には可能です)。入力データを処理し、キュー内の次のハンドラーに渡します。
app.use([path], function)
app.allは複数のコールバックを受け取り、ルーティングを目的としています。複数のコールバックを使用すると、リクエストをフィルタリングしてレスポンスを送信できます。Express.jsのフィルターで説明されています
app.all(path, [callback...], callback)
app.useは、URL が指定されたパスで始まるかどうかのみを確認します
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.allは完全なパスに一致します
app.all( "/product" , handler);
// will match /product
// won't match /product/cool <-- important
// won't match /product/foo <-- important
app.all( "/product/*" , handler);
// won't match /product <-- Important
// will match /product/
// will match /product/cool
// will match /product/foo
app.use:
- たとえば、ヘッダー、Cookie、セッションなどを構成するフロントコントローラーにミドルウェアを挿入します。
- app[http_method] の前に記述する必要があります。そうしないと実行されません。
- いくつかの呼び出しは書き込み順に処理されます
app.all:
- (app[http_method] など) は、ルートのコントローラーの構成に使用されます
- 「all」は、すべての http メソッドに適用されることを意味します。
- いくつかの呼び出しは書き込み順に処理されます
次の expressJs コード サンプルを見てください。
var express = require('express');
var app = express();
app.use(function frontControllerMiddlewareExecuted(req, res, next){
console.log('(1) this frontControllerMiddlewareExecuted is executed');
next();
});
app.all('*', function(req, res, next){
console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
next();
});
app.all('/hello', function(req, res, next){
console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
next();
});
app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
next();
});
app.get('/hello', function(req, res){
console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
res.send('Hello World');
});
app.listen(80);
ルート「/hello」にアクセスしたときのログは次のとおりです。
(1) this frontControllerMiddlewareExecuted is executed
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response
を使用app.use()
すると、「マウント」パスが削除され、ミドルウェア機能からは見えなくなります。
app.use('/static', express.static(__dirname + '/public'));
マウントされたミドルウェアfunctions(express.static
)は、このプレフィックス()が含まれていない限り呼び出されません。req.url
このプレフィックス(/static
)が含まれていると、関数が呼び出されたときに 削除されます。
を使用app.all()
すると、その動作はありません。
上記のすべての回答の2つの違いは言及されていません。
1 つ目:
app.all
パス パラメーターとして正規表現を受け入れます。app.use
正規表現を受け入れません。
2 つ目:
app.all(path, handler)
またはapp[method](path, handler)
ハンドラはすべてpath
同じでなければなりません。これでパスは完成です。 path
app[method]
app.use(path, handler)
のパスが完全な場合use
、ハンドラーのパスは である必要があります/
。のパスが完全なパスの開始である場合use
、ハンドラー パスは完全なパスの残りの部分でなければなりません。
app.use("/users", users);
//users.js: the handler will be called when matchs `/user/` path
router.get("/", function (req, res, next) {
res.send("respond with a resource");
});
// others.js: the handler will be called when matches `/users/users` path
router.get("/users", function (req, res, next) {
res.send("respond with a resource");
});
app.all("/users", users);
//others.js: the handler will be called when matches `/`path
router.get("/", function (req, res, next) {
res.send("respond with a resource");
});
//users.js: the handler will be called when matches `/users` path
router.get("/users", function (req, res, next) {
res.send("respond with a resource");
});