express.js の app.use と app.get の違い 質問する

express.js の app.use と app.get の違い 質問する

私は Express と node.js を使い始めたばかりで、app.use と app.get の違いがわかりません。どちらも情報を送信するのに使えるようです。例えば:

app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

これは次のものと同じようです:

app.get('/', function (req,res) {
   res.send('Hello');
});

ベストアンサー1

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'));

// ...

/を「mount」パスとして指定すると、app.use()は で始まるすべてのパスに応答します/。これは、使用される HTTP 動詞に関係なく、すべてです。

  • GET /
  • PUT /foo
  • POST /foo/bar

app.get()一方、は Express のアプリケーション ルーティングの一部であり、HTTP 動詞で要求されたときに特定のルートを照合して処理することを目的としていますGET

  • 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に含まれています。

おすすめ記事