133

Node.js で実行されている Express.jsapp.all("*", … )との間に有用な違いはありますか?app.use("/", … )

4

7 に答える 7

102

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
于 2014-06-12T19:04:54.470 に答える
21
  • app.use:

    1. たとえば、ヘッダー、Cookie、セッションなどを構成するフロントコントローラーにミドルウェアを挿入します。
    2. app[http_method] の前に記述する必要があります。そうしないと実行されません。
    3. いくつかの呼び出しは書き込み順に処理されます
  • app.all:

    1. (app[http_method] など) は、ルートのコントローラーの構成に使用されます
    2. 「all」は、すべての http メソッドに適用されることを意味します。
    3. いくつかの呼び出しは書き込み順に処理されます

次の 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
于 2013-11-13T13:48:05.547 に答える
13

を使用app.use()すると、「マウント」パスが削除され、ミドルウェア機能からは見えなくなります。

app.use('/static', express.static(__dirname + '/public'));

マウントされたミドルウェアfunctions(express.static)は、このプレフィックス()が含まれていない限り呼び出されません。req.urlこのプレフィックス(/static)が含まれていると、関数が呼び出されたときに 削除されます。

を使用app.all()すると、その動作はありません。

于 2013-03-19T06:28:15.113 に答える
1

上記のすべての回答の2つの違いは言及されていません。

1 つ目:
app.allパス パラメーターとして正規表現を受け入れます。app.use正規表現を受け入れません。

2 つ目:
app.all(path, handler)またはapp[method](path, handler)ハンドラはすべてpath同じでなければなりません。これでパスは完成です。 pathapp[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");
});
于 2018-12-23T11:12:29.250 に答える