programing

app.use와 app.get in express.js의 차이

closeapi 2023. 5. 21. 11:29
반응형

app.use와 app.get in express.js의 차이

나는 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
  • 기타.

반면에, 는 Express의 애플리케이션 라우팅의 일부이며, 요청 시 특정 경로를 일치시키고 처리하기 위한 app.get()것입니다.GETHTTP 파일:

  • GET /

그고예대, 의동등라우한팅한에리당신▁for▁of▁routingent와 같은 루팅을 .app.use()실제로는 다음과 같습니다.

app.all(/^\/.*/, function (req, res) {
    res.send('Hello');
});

(업데이트: 차이를 더 잘 보여주려고 노력합니다.)

에는 포을함라방법우를 합니다.app.get()요청에 대한 응답을 보다 정확하게 정렬하는 데 도움이 되는 편리한 방법입니다.또한 매개 변수와 같은 기능에 대한 지원을 추가합니다.next('route').

각의내부 app.get()에 대한 전화입니다.app.use()▁with▁of▁do있▁so▁all▁this▁certainly니습▁can로 이 모든 것을 할 수 있습니다.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의 이러한 기능 구현은 , 및 에 포함되어 있습니다.

app.는 " 요청에 실행"을 의미합니다. Simply app.use는 " this on requests"입니다.
은 "대해 대해 을 실행"을 의미합니다. app.get은 "URL" "GET"입니다.

app.use 수준"입니다. Express는 "연결" "연결"입니다.

제 가이드라인은 다음과 같습니다.

  • 사용하다app.getGET 메서드를 노출하려는 경우.
  • 사용하다app.use일부 미들웨어(Express에서 설정한 경로에 HTTP 요청이 도착하기 전의 처리기)를 추가하거나 경로를 모듈식으로 설정하려는 경우(예: 다른 웹 응용 프로그램에서 사용할 수 있는 npm 모듈의 경로 집합 노출).

app.getHTTP 메서드가 다음으로 설정될 때 호출됩니다.GET에, 면에반에.app.useHTTP 메서드에 관계없이 호출되므로 익스프레스 패키지에서 액세스할 수 있는 다른 모든 RESTful 유형의 맨 위에 있는 계층을 정의합니다.

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

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

app.getGET 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() 처리기Route Handler")를 합니다.app.all(),app.get/post/put...등)만 해당합니다.이후에 미들웨어가 있으면 건너뜁니다.따라서 모든 미들웨어를 항상 경로 핸들러 위에 놓는 것이 좋습니다.

위의 설명 외에도, 제가 경험하는 것은 다음과 같습니다.

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

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

app.get('/book')  

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

경로를 핸들러를 , 모든경로처글핸원면한다를러들로벌는리하를,app.use('/')이 옵션입니다. app.get('/')루트 만 처리합니다. URL은 를 참조하십시오.

제가 지금까지 발견한 차이점은 크게 세 가지입니다.세 번째 것은 그렇게 명백하지 않고 당신은 그것이 흥미롭다고 생각할지도 모릅니다.급행에 대한 차이가 동일합니다.router은 것은그를 의미합니다.router.use()그리고.router.get()혹은 그 밖의post,put,alletc 방법도 같은 차이가 있습니다.

1

  • app.use(path, callback)HTTP 요청에 응답합니다.
  • app.get(path, callback)에만 합니다.GETHTTP 요청입니다.방법으로, 같방로으식은,,.post(..),.put(..)등이 해당 요청에 응답할 것입니다. app.all()에 응답하므로 HTTP는 "으"로 표시됩니다.app.use()그리고.app.all()이 부분도 마찬가지입니다.

2

  • app.use(path, callback)요청 경로의 접두사와 일치하며 요청 경로의 접두사가 경로 매개 변수와 일치하는 경우 응답합니다.를 들어, 파라미터가 " " " " "일 등입니다."/"그러면 일치할 것입니다."/","/about","/users/123"
  • app.get(path, callback)여기 있는 게 전체 경로와 일치합니다. 및 "" HTTP 요청"에 .app.all()를 들어,가 " " "일 , " " " 입니다."/"그러면 일치할 뿐입니다."/".

3

next('route') 의 미들웨어/콜백 기능에서 작동하지 않음app.use()이 기능은 다음 경우에만 작동합니다.app.get(),app.all()기타 HTTP 요청의 유사한 기능.

명시된 문서에 따르면:

next('루트')는 앱을 사용하여 로드된 미들웨어 기능에서만 작동합니다.방법() 또는 라우터.MODE() 함수입니다.

MODE는 미들웨어 함수(예: GET, PUT 또는 POST)가 소문자로 처리하는 요청의 HTTP 메서드입니다.

부터는 MODE라는 MODE라는 하겠습니다.get,post,all 타기.
하만무엇이 입니까?next('route')?!

어디 보자꾸나

다음 경로')

우리는 봅니다.app.use()또는app.METHOD()여러 콜백/미들웨어 기능을 사용할 수 있습니다.

명시적 설명서에서 다음을 참조하십시오.

미들웨어 기능은 응용프로그램의 요청-응답 주기에서 요청 개체(req), 응답 개체(res) 및 다음 미들웨어 기능에 액세스할 수 있는 기능입니다.다음 미들웨어 함수는 일반적으로 next라는 변수로 표시됩니다.

현재 미들웨어 기능이 요청-응답 사이클을 종료하지 않으면 다음 미들웨어 기능으로 제어 권한을 전달하기 위해 next()를 호출해야 합니다.그렇지 않으면 요청이 보류된 상태로 유지됩니다.

따라서 각 미들웨어 함수는 다음 미들웨어 함수를 호출하거나 응답을 종료해야 합니다.그리고 이것은 같은 것입니다.app.use()그리고.app.METHOD().

그러나 경우에 따라 현재 경로에 대한 다음 콜백 함수를 모두 건너뛰고 응답을 지금 당장 종료하지 않을 수도 있습니다.왜냐하면 일치해야 할 다른 경로가 있을 수 있기 때문입니다. 를 .next('route')현재 경로의 모든 콜백 기능을 건너뛰고 다음 경로와 일치하도록 검색합니다.

예: (고속 설명서에서)

app.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next route
  if (req.params.id === '0') next('route')
  // otherwise pass the control to the next middleware function in this stack
  else next()
}, function (req, res, next) {
  // send a regular response
  res.send('regular')
})

// handler for the /user/:id path, which sends a special response
app.get('/user/:id', function (req, res, next) {
  res.send('special')
})

에서, 요▁see서조▁in에.(req.params.id === '0')다음 콜백 함수를 건너뛰고 싶지만 동일한 경로 매개 변수의 다른 경로가 일치하고 해당 경로가 특별한 응답을 전송하기 때문에 응답을 종료하고 싶지 않습니다.(예, 동일한 경로 매개 변수를 동일하게 사용하는 것이 유효합니다.METHOD여러번때까지 합니다.)이 경우 응답이 종료될 때까지 모든 경로가 일치합니다.그래서 그런 경우에, 우리는 다음을 실행합니다.next('route')현재 경로의 모든 콜백 기능을 건너뜁니다.여기서 조건이 충족되지 않으면 다음 콜백 함수를 호출합니다.

것이.next('route')은 합니다.app.METHOD()기능들.

빠른 문서에서 호출:

next('루트')는 앱을 사용하여 로드된 미들웨어 기능에서만 작동합니다.방법() 또는 라우터.MODE() 함수입니다.

현재 경로의 모든 콜백 기능을 건너뛸 수 없기 때문에app.use()우리는 여기서 조심해야 합니다.는 의미웨어사합니다야용해의 .app.use()어떤 조건에서도 건너뛸 필요가 없습니다.응답을 종료하거나 모든 콜백 함수를 처음부터 끝까지 횡단해야 하기 때문에, 우리는 그것들을 전혀 건너뛸 수 없습니다.

자세한 내용은 여기를 방문하십시오.

요청이 서버로 전송될 때마다 app.use가 호출됩니다.
단, Get, Put, Post 등의 요청을 처리하기 전에 먼저 호출해야 합니다.

app.use(middleware); 
function middleware(req, res, next)
{
  console.log("Came in middleware function without arrow");
  next();
}

app.get은 지정된 경로에 대한 forget 요청만 호출됩니다.

app.get('/myget', myget_function);
function myget_function(req, res)
{
  console.log("Came in function myget");
  res.send('Hello World! from myget');
}

app.post 은 지정된 경로에 대한 게시 요청에 대해서만 호출됩니다.

app.post('/mypost', mypost_function); 
function mypost_function(req, res)
{
  console.log("Came in function mypost");
  res.send('Hello World! from mypost');
}

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

반응형