Node.JS Express app.all('*', ... )
와 사이에 유용한 차이점이 app.use('/', ...)
있습니까?
Node.JS Express app.all('*', ... )
와 사이에 유용한 차이점이 app.use('/', ...)
있습니까?
답변:
대부분의 경우 동일하게 작동합니다. 가장 큰 차이점은 미들웨어가 적용되는 순서입니다.
app.all()
애플리케이션의 라우터에 연결되므로 app.router 미들웨어에 도달 할 때마다 사용됩니다 (모든 메서드 경로를 처리합니다 ... GET, POST 등).알림 : app.router는 Express 4.x에서 더 이상 사용되지 않습니다.
app.use()
애플리케이션의 기본 미들웨어 스택에 연결되므로 미들웨어에서 지정한 순서대로 사용됩니다. 예를 들어, 첫 번째로 넣으면 가장 먼저 실행됩니다. 마지막에 넣으면 (라우터 뒤에) 일반적으로 전혀 실행되지 않습니다.일반적으로 모든 경로에 대해 전역 적으로 작업을 수행하려면 app.use ()가 더 나은 옵션입니다. 또한 Express 0.4는 아마도 암시 적 라우터를 떨어 뜨릴 것이므로 향후 버그의 가능성이 적습니다 (즉, 기술적으로 사용할 필요조차 없기 때문에 미들웨어에서 라우터의 위치가 지금보다 더 중요 할 것입니다. 지금).
next("route")
와 함께 사용할 수 app.all
있지만에서는 사용할 수 없습니다 app.use
.
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
app.use :
app.all :
이 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
를 사용 app.use()
하면 "마운트"경로가 제거되고 미들웨어 기능에 표시되지 않습니다.
app.use('/static', express.static(__dirname + '/public'));
마운트 된 미들웨어 함수 ( express.static
)는 req.url
에이 접두사 ( /static
) 가 포함되어 있지 않으면 호출되지 않습니다. 이 접두어 는 함수가 호출 될 때 제거 됩니다.
를 사용하면 app.all()
해당 동작이 없습니다.
예, app.all()
모든 유형의 요청 방법 (POST, GET, PUT 또는 DELETE)으로 특정 URI가 요청 될 때 호출됩니다.
반면 app.use()
에 사용중인 모든 미들웨어에 사용되며 경로 접두사에 마운트되며 해당 경로 아래의 URI가 요청 될 때마다 호출됩니다.
위의 모든 답변은 두 가지 차이점이 없습니다.
첫 번째 : 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');
});
두 가지 주요 차이점이 있습니다.
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();});