app.all ( '*')과 app.use ( '/')의 차이점


121

Node.JS Express app.all('*', ... )와 사이에 유용한 차이점이 app.use('/', ...)있습니까?

답변:


119

대부분의 경우 동일하게 작동합니다. 가장 큰 차이점은 미들웨어가 적용되는 순서입니다.

  • app.all() 애플리케이션의 라우터에 연결되므로 app.router 미들웨어에 도달 할 때마다 사용됩니다 (모든 메서드 경로를 처리합니다 ... GET, POST 등).

알림 : app.router는 Express 4.x에서 더 이상 사용되지 않습니다.

  • app.use()애플리케이션의 기본 미들웨어 스택에 연결되므로 미들웨어에서 지정한 순서대로 사용됩니다. 예를 들어, 첫 번째로 넣으면 가장 먼저 실행됩니다. 마지막에 넣으면 (라우터 뒤에) 일반적으로 전혀 실행되지 않습니다.

일반적으로 모든 경로에 대해 전역 적으로 작업을 수행하려면 app.use ()가 더 나은 옵션입니다. 또한 Express 0.4는 아마도 암시 적 라우터를 떨어 뜨릴 것이므로 향후 버그의 가능성이 적습니다 (즉, 기술적으로 사용할 필요조차 없기 때문에 미들웨어에서 라우터의 위치가 지금보다 더 중요 할 것입니다. 지금).


15
Express 4.x 이후에도 적용됩니까? app.router가 제거되었습니다.
ruffrey 2014

1
next("route")와 함께 사용할 수 app.all있지만에서는 사용할 수 없습니다 app.use.
Jozef Mikušinec

@JozefMikusinec 문서가 그렇지 ... 제안하는 것 expressjs.com/en/guide/writing-middleware.html
musicin3d

귀하의 링크는 next ( 'route')를 언급하지 않지만 API를 살펴 보았습니다.
Jozef Mikušinec

2
@ musicin3d 더 조사한 결과 "next () 및 next ( 'route')가 app.use와 차이가 없음"(인용문)을 확인하는 이 GitHub 문제를 발견했습니다 . 문서를 변경해야합니다.
Jozef Mikušinec

87

app.use 는 콜백 함수를 하나만 취하며 미들웨어를위한 것입니다. 미들웨어는 일반적으로 요청 및 응답을 처리하지 않으며 (기술적으로 가능) 입력 데이터를 처리하고 대기열의 다음 처리기에 넘깁니다.

app.use([path], function)

app.all 은 여러 콜백을 사용하며 라우팅을 의미합니다. 여러 콜백으로 요청을 필터링하고 응답을 보낼 수 있습니다. express.js의 필터에 설명되어 있습니다.

app.all(path, [callback...], callback)

app.use 는 URL이 지정된 경로로 시작하는지 여부 만 확인합니다.

app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo

app.all 은 전체 경로와 일치합니다.

app.all( "/product" , handler);
// will match /product
// won't match /product/cool   <-- important
// won't match /product/foo    <-- important

app.all( "/product/*" , handler);
// won't match /product        <-- Important
// will match /product/
// will match /product/cool
// will match /product/foo

17
적어도 v4에서 app.use 는 "하나만"이 아닌 하나 이상의 미들웨어 기능을 사용합니다.
Jess Austin

2
app.use는 URL이 지정된 경로로 시작하는지 여부 만 확인합니다. app.all은 전체 경로와 일치합니다. 이것이 주요 차이점입니다.
meizilp

@frogcjn 아니 그것은 내 질문에서 * 및 /를 무시하지 않아야합니다.
ostergaard

15
  • app.use :

    1. 예를 들어 헤더, 쿠키, 세션 등을 구성하는 프런트 컨트롤러에 미들웨어를 삽입합니다.
    2. app [http_method] 전에 작성해야합니다. 그렇지 않으면 실행되지 않습니다.
    3. 여러 번의 호출이 작성된 순서대로 처리됩니다.
  • app.all :

    1. (app [http_method]와 같은) 경로의 컨트롤러를 구성하는 데 사용됩니다.
    2. "all"은 모든 http 메소드에 적용됨을 의미합니다.
    3. 여러 번의 호출이 작성된 순서대로 처리됩니다.

이 expressJs 코드 샘플을보십시오.

var express = require('express');
var app = express();

app.use(function frontControllerMiddlewareExecuted(req, res, next){
  console.log('(1) this frontControllerMiddlewareExecuted is executed');
  next();
});

app.all('*', function(req, res, next){
  console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
  next();
});

app.all('/hello', function(req, res, next){
  console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
  next();
});

app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
  console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
  next();
});

app.get('/hello', function(req, res){
  console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
  res.send('Hello World');
});

app.listen(80);

다음은 '/ hello'경로에 액세스 할 때의 로그입니다.

(1) this frontControllerMiddlewareExecuted is executed
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response

6
이 예제를 Express 4.x에서 그대로 실행 한 후 실제로 5 개를 모두 순서대로 실행합니다. 이것은이 글이 쓰여진 후 거의 3 년 동안 표현이 변경 되었기 때문일 것입니다. 그러나 저는 명확성을 위해 이것을 추가 할 것이라고 생각했습니다.
Nathan Wiebe 2017 년

11

를 사용 app.use()하면 "마운트"경로가 제거되고 미들웨어 기능에 표시되지 않습니다.

app.use('/static', express.static(__dirname + '/public'));

마운트 된 미들웨어 함수 ( express.static)는 req.url에이 접두사 ( /static) 가 포함되어 있지 않으면 호출되지 않습니다. 이 접두어 는 함수가 호출 될 때 제거 됩니다.

를 사용하면 app.all()해당 동작이 없습니다.


이 질문은 app.use ( '/', ...)에 대해서만 명시 적으로 묻습니다.
ostergaard 2013 년

이것은 2018 년에도 여전히 사실 인 질문에 대한 정답입니다! 미들웨어도 all ()로 마운트 할 수 있습니다. 유일한 차이점은 미들웨어를 실행할 때 마운트 경로가 제거된다는 것입니다.
Xatian

4

예, app.all()모든 유형의 요청 방법 (POST, GET, PUT 또는 DELETE)으로 특정 URI가 요청 될 때 호출됩니다.

반면 app.use()에 사용중인 모든 미들웨어에 사용되며 경로 접두사에 마운트되며 해당 경로 아래의 URI가 요청 될 때마다 호출됩니다.

다음은 app.allapp.use에 대한 설명서입니다 .


고맙지 만 app.all 와일드 카드와 app.use 루트 경로를 놓친 것 같습니다. app.all은 콜백 배열을 취할 수 있고 app.use는 하나만 취할 수 있다는 점을 제외하고는-맞습니까?
ostergaard

1

위의 모든 답변은 두 가지 차이점이 없습니다.

첫 번째 : app.all정규식을 경로 매개 변수로 허용합니다. app.use정규식을 허용하지 않습니다.

두 번째 : app.all(path,handler)또는 app[method](path,handler), 핸들러 path모든 path . 이것은, app [method] '경로가 완성되었습니다.

app.use(path,hanlder), 사용 경로가 완료되면 hanlder 경로는 '/'이어야하며 사용 경로가 전체 경로의 시작 인 경우 핸들러 경로는 나머지 전체 경로 여야합니다.

 app.use('/users', users);

  //users.js:  the handler will be called when matchs `/user/` path
      router.get('/', function(req, res, next) {
      res.send('respond with a resource');
    });
  // others.js: the handler will be called when matchs `/users/users` path
      router.get('/users', function(req, res, next) {
      res.send('respond with a resource');
    });

app.all('/users', users);

//others.js: the handler wil be called when matchs `/`path
router.get('/', function(req, res, next) {
     res.send('respond with a resource');
});
//users.js: the handler will be called when matchs `/users` path
router.get('/users', function(req, res, next) {
    res.send('respond with a resource');
 });

0

두 가지 주요 차이점이 있습니다.

1. 패턴 일치 (Palani가 제공 한 답변)
2. next(route)를 사용하여로드 된 미들웨어의 함수 본문 내에서 작동하지 않습니다 app.use. 이것은 문서의 링크에 명시되어 있습니다.

NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.

링크 : http://expressjs.com/en/guide/using-middleware.html

의 작동 효과 next('route')는 다음 예에서 볼 수 있습니다.

app.get('/',
(req,res,next)=>{console.log("1");
next(route); //The code here skips ALL the following middlewares
}
(req,res,next)=>{next();}, //skipped
(req,res,next)=>{next();}  //skipped
);

//Not skipped
app.get('/',function(req,res,next){console.log("2");next();});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.