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()
것입니다.GET
HTTP 파일:
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.get
GET 메서드를 노출하려는 경우. - 사용하다
app.use
일부 미들웨어(Express에서 설정한 경로에 HTTP 요청이 도착하기 전의 처리기)를 추가하거나 경로를 모듈식으로 설정하려는 경우(예: 다른 웹 응용 프로그램에서 사용할 수 있는 npm 모듈의 경로 집합 노출).
app.get
HTTP 메서드가 다음으로 설정될 때 호출됩니다.GET
에, 면에반에.app.use
HTTP 메서드에 관계없이 호출되므로 익스프레스 패키지에서 액세스할 수 있는 다른 모든 RESTful 유형의 맨 위에 있는 계층을 정의합니다.
사의차이의 app.use
&app.get
:
app.use
일반적으로 응용프로그램에 미들웨어를 도입하는 데 사용되며 모든 유형의 HTTP 요청을 처리할 수 있습니다.
app.get
GET HTTP 요청만 처리합니다.
자, 두 사람 사이에 혼동이 있습니다.app.use
&app.all
의심할 여지 없이, 그들의 공통점은 두 가지 모두 모든 종류의 HTTP 요청을 처리할 수 있다는 것입니다.그러나 미들웨어에는 app.use를, 경로 처리에는 app.all을 사용할 것을 권장하는 몇 가지 차이점이 있습니다.
app.use()
콜백은 한 번만 하면 됩니다.
app.all()
여러 콜백이 필요할 수 있습니다.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
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
,all
etc 방법도 같은 차이가 있습니다.
1
app.use(path, callback)
HTTP 요청에 응답합니다.app.get(path, callback)
에만 합니다.GET
HTTP 요청입니다.방법으로, 같방로으식은,,.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
'programing' 카테고리의 다른 글
공식 R1C1의 기능은 무엇입니까? (0) | 2023.05.21 |
---|---|
web.config 변환을 사용하여 "Replace Or Insert"를 수행할 수 있는 방법이 있습니까? (0) | 2023.05.21 |
Android용 Eclipse의 관리 오류:configChanges (0) | 2023.05.21 |
Swift에서 프로그래밍 방식으로 번들 식별자를 가져오시겠습니까? (0) | 2023.05.21 |
템플릿 기반 폼과 반응형 폼의 실질적인 차이점은 무엇입니까? (0) | 2023.05.21 |