나는 표현과 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의 응용 프로그램 라우팅의 일부이며 GET
HTTP 동사로 요청 될 때 특정 경로를 일치시키고 처리하기위한 것입니다 .
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.get
GET 메소드를 노출하려는 경우 사용하십시오 .- 사용
app.use
이 모듈 당신의 경로를 확인하려는 경우 (당신이 익스프레스에서 설정 한 경로에 도착하기 전에 HTTP 요청에 대한 처리기를) 일부 미들웨어를 추가하려는 경우, 또는 (예를 들어, 경로의 집합을 노출 다른 웹 응용 프로그램에서 사용할 수있는 npm 모듈에서).
답변
간단히 app.use는“모든 요청에서 이것을 실행합니다”를
의미 합니다. app.get은“주어진 URL에 대해 GET 요청에서 이것을 실행 합니다”를 의미합니다
답변
app.get
는 HTTP 메소드 가로 설정 될 때 호출되는 GET
반면 app.use
, HTTP 메소드에 관계없이 호출되므로 Express 패키지가 액세스 할 수있는 다른 모든 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()
(다음 경로 처리기를 호출합니다app.all()
,app.get/post/put...
단지 등). 이후 미들웨어가 있으면 건너 뜁니다. 따라서 모든 미들웨어를 항상 경로 처리기 위에 두는 것이 좋습니다.
답변
위의 설명 외에도 내가 경험하는 것 :
app.use('/book', handler);
URL로 ‘/ book’으로 시작하는 모든 요청과 일치합니다 . ‘/ book / 1’또는 ‘/ book / 2’와도 일치합니다.
app.get('/book')
정확히 일치하는 GET 요청 만 일치 합니다. ‘/ book / 1’또는 ‘/ book / 2’와 같은 URL은 처리하지 않습니다.
따라서 모든 경로를 처리하는 전역 처리기를 원한다면 app.use('/')
옵션입니다. app.get('/')
루트 URL 만 처리합니다.