Programing

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

crosscheck 2020. 5. 14. 22:18
반응형

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.get is called when the HTTP method is set to GET, whereas app.use is called regardless of the HTTP method, and therefore defines a layer which is on top of all the other RESTful types which the express packages gives you access to.


Difference between app.use & app.get:

app.use → It is generally used for introducing middlewares in your application and can handle all type of HTTP requests.

app.get → It is only for handling GET HTTP requests.

Now, there is a confusion between app.use & app.all. No doubt, there is one thing common in them, that both can handle all kind of HTTP requests. But there are some differences which recommend us to use app.use for middlewares and app.all for route handling.

  1. app.use() → It takes only one callback.
    app.all() → It can take multiple callbacks.

  2. app.use() will only see whether url starts with specified path.
    But, app.all() will match the complete path.

For example,

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/author
  1. next() call inside the app.use() will call either the next middleware or any route handler, but next() call inside app.all() will invoke the next route handler (app.all(), app.get/post/put... etc.) only. If there is any middleware after, it will be skipped. So, it is advisable to put all the middlewares always above the route handlers.

참고URL : https://stackoverflow.com/questions/15601703/difference-between-app-use-and-app-get-in-express-js

반응형