1. ホーム
  2. node.js

[解決済み】express.jsのapp.useとapp.getの違いについて

2022-04-05 01:05:22

質問

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

解決方法は?

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) {
      // ...
    });
    
    

    vs.

    app.use('/', function (req, res, next) {
      if (req.method !== 'GET' || req.url !== '/')
        return next();
    
      // ...
    });
    
    
  • 同じルートに対して複数のハンドラを持つ

    app.get('/', authorize('ADMIN'), function (req, res) {
      // ...
    });
    
    

    vs.

    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;
      // ...
    });
    
    

    vs.

    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 .