[node.js] express.js에서 app.use와 app.get의 차이점

나는 표현과 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'));

// ...

/마운트 “경로 로 지정 하면 사용되는 HTTP 동사에 관계없이로 app.use()시작하는 모든 경로에 응답합니다 /.

  • GET /
  • PUT /foo
  • POST /foo/bar
  • 기타

app.get()반면, Express의 응용 프로그램 라우팅의 일부이며 GETHTTP 동사로 요청 될 때 특정 경로를 일치시키고 처리하기위한 것입니다 .

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

참고 :이 기능의 익스프레스 ‘구현의에 포함되어 Router, Layer하고Route .


답변

app.use Express가 의존하는 미들웨어 프레임 워크 인 Connect의 “낮은 레벨”방법입니다.

내 지침은 다음과 같습니다.

  • app.getGET 메소드를 노출하려는 경우 사용하십시오 .
  • 사용 app.use이 모듈 당신의 경로를 확인하려는 경우 (당신이 익스프레스에서 설정 한 경로에 도착하기 전에 HTTP 요청에 대한 처리기를) 일부 미들웨어를 추가하려는 경우, 또는 (예를 들어, 경로의 집합을 노출 다른 웹 응용 프로그램에서 사용할 수있는 npm 모듈에서).

답변

간단히 app.use는“모든 요청에서 이것을 실행합니다”를
의미 합니다. app.get은“주어진 URL에 대해 GET 요청에서 이것을 실행 합니다”를 의미합니다


답변

app.getHTTP 메소드 가로 설정 될 때 호출되는 GET반면 app.use, HTTP 메소드에 관계없이 호출되므로 Express 패키지가 액세스 할 수있는 다른 모든 RESTful 유형 위에있는 계층을 정의합니다.


답변

app.use&의 차이점app.get :

app.use → 일반적으로 응용 프로그램에 미들웨어를 도입하는 데 사용되며 모든 유형의 HTTP 요청을 처리 할 수 ​​있습니다.

app.get → GET HTTP 요청 만 처리합니다.

이제 app.use& 사이에 혼란이 app.all있습니다. 의심 할 여지없이, 그들 모두 공통점이 있는데, 둘 다 모든 종류의 HTTP 요청을 처리 할 수 ​​있습니다. 그러나 미들웨어에는 app.use를 사용하고 경로 처리에는 app.all을 사용하도록 권장하는 몇 가지 차이점이 있습니다.

  1. app.use()→ 콜백은 한 번만 걸립니다.
    app.all()→ 여러 개의 콜백이 걸릴 수 있습니다.

  2. 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
  1. next()(가) 내부 호출 app.use()다음 미들웨어 또는 경로 처리기 중 하나를 호출하지만, next()호출 내부가 app.all()(다음 경로 처리기를 호출합니다 app.all(), app.get/post/put...단지 등). 이후 미들웨어가 있으면 건너 뜁니다. 따라서 모든 미들웨어를 항상 경로 처리기 위에 두는 것이 좋습니다.

답변

위의 설명 외에도 내가 경험하는 것 :

app.use('/book', handler);  

URL로 ‘/ book’으로 시작하는 모든 요청과 일치합니다 . ‘/ book / 1’또는 ‘/ book / 2’와도 일치합니다.

app.get('/book')  

정확히 일치하는 GET 요청 만 일치 합니다. ‘/ book / 1’또는 ‘/ book / 2’와 같은 URL은 처리하지 않습니다.

따라서 모든 경로를 처리하는 전역 처리기를 원한다면 app.use('/')옵션입니다. app.get('/')루트 URL 만 처리합니다.


답변