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


220

나는 표현과 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
당신은 세 가지 다른 답변을 가지고, 주제에 뭔가를 기여하는 것 같습니다 :) 관련 질문 stackoverflow.com/questions/11321635/…
— Benjamin Gruenbaum

예, 모든 좋은 답변입니다. 고마워, 내가 살펴볼 게
— Andre Vorobyov

답변:


219

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 .


3
내장 된 앱을 언급 해 주셔서 감사합니다. Express 미들웨어를 구성하는 매우 편리한 방법입니다.
— wprl

4
app.use가 각각의 app.get, app.post, app.put이 수행 할 수있는 모든 것을 할 수 있지만 그 반대도 가능하지 않다고 말하는 것이 공정합니까?
— ngungo

6
여전히 이해하기 어렵다.
— Jeb50

1
그것의 좋은 무슨 소용 알고 있습니다 얻을 수 에 대한 ,하지만 아무도 그들이 다른 기능을하는 방법을 설명하는 훌륭한 일을하지 않습니다. 내가 수집 할 수있는 것에서 모든 .use 핸들러가 먼저 실행되고 .use 는 지정된 경로로 시작 하는 모든 경로와 일치합니다 (예 : .use ( '/', ...) 및 .get ( '/ *', ... )는 동일한 경로와 일치합니다. 나를 위해 움직이는 부분을 볼 때 전반적인 개념을 이해하는 것이 더 쉽습니다.
— snarf

2
내 의견은 날짜가 path-to-regexp더 이상 필요하지 않거나 더 이상 use메소드 의 첫 번째 인수에서 직접 경로 매개 변수를 사용할 수 있다는 점 에서이 응답이 오래되고 더 이상 사용되지 않는다는 것이 중요 합니다 .
— vdegenne

50

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

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

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

그러나 방법에 신경 쓰지 않으면 app.use일부 경로를 처리 하는 데 사용할 수 있습니까? 또는 app.use라우팅에 절대 사용해서는 안됩니다 .
— Elemento0

app.use를 사용하여 경로를 별도의 파일 eq로 옮길 수 있습니다. users.js, building.js
— Rob Angelier

1
위의 한 가지 대답은 훨씬 더 많은 UP / AGREE를 수집했지만 귀하의 대답은 미들웨어를 포함한 정교한 것을 몇 가지 간단한 단어 인 kudo로 변환합니다.
— Jeb50

50

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


그렇게 간단하지 않습니다. 다른 답변을 읽으십시오.
— David Lopez

28

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


19

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...단지 등). 이후 미들웨어가 있으면 건너 뜁니다. 따라서 모든 미들웨어를 항상 경로 처리기 위에 두는 것이 좋습니다.

1
요점 3은 Express 4.16에 적용되지 않는 것 같습니다. next()내부 호출 app.all('/*', ...)은 실제로 app.use('/', ...)파일에서 나중에 실행 됩니다. 어쩌면 내가 당신을 오해했을 수도 있습니다. 그렇지 않으면 매우 유용한 설명입니다.
— 년

4.17에서 나는 @BeetleJuice와 같은 것을 관찰했다
— David Lopez

4

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

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

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

app.get('/book')  

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.