Node.js / Express.js - app.router는 어떻게 작동합니까?
에 대해 에.app.router
적어도 미들웨어를 사용할 때 제가 생각하는 것은 무엇인지 설명해야 할 것 같습니다.하기 위해 은 미웨어사위기해사기능입니다.app.use()
될 때 할 때 미웨어가실때다미호다출니합를들을 합니다.next()
또는 더 이상 미들웨어가 호출되지 않도록 합니다.이는 미들웨어 호출 순서가 중요하다는 것을 의미합니다. 어떤 미들웨어는 다른 미들웨어에 따라 다르며 어떤 미들웨어는 호출되지 않을 수도 있기 때문입니다.
오늘은 애플리케이션 작업을 하다가 서버를 백그라운드에서 실행했습니다.몇 가지 변경 사항을 적용하고 페이지를 새로 고치고 변경 사항을 즉시 확인하고 싶었습니다.구체적으로, 저는 제 레이아웃을 변경하고 있었습니다.작동이 되지 않아 스택 오버플로를 검색하여 답을 찾았고 이 질문을 발견했습니다.그것은 확인하라고 쓰여 있습니다.express.static()
보다 아래에 있음require('stylus')
하지만 제가 그 작전 코드를 보고 있을 때, 저는 그가 그의 것을 가지고 있다는 것을 보았습니다.app.router
그의 미들웨어 통화의 맨 끝에 전화를 걸었고, 저는 그 이유를 알아내려고 했습니다.
.0rc4을 만들 때 Express.js 파일(3.0.0rc4) 했습니다.express app --sessions --css stylus
는 나의 app.js와 함께 설정되었습니다.app.router
의 양쪽 에.express.static()
그리고.require('stylus')
전화입니다. 그래서, 만약에 이미 설정이 되어 있다면, 그렇게 유지되어야 할 것 같습니다.
스타일러스 변경 사항을 확인할 수 있도록 코드를 다시 정렬한 후 다음과 같이 나타납니다.
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
그래서 저는 첫 번째 단계는 왜 그것을 갖는 것이 중요한지를 알아내는 것이라고 결정했습니다.app.router
내 규정으로는.그래서 저는 댓글을 달았고, 제 앱을 시작했고, 다음으로 이동했습니다./
인덱스 페이지가 잘 표시되었습니다.흠, 제가 경로 파일(경로)에서 경로를 내보내는 중이었기 때문에 효과가 있었는지도 모릅니다. 다음으로 저는 인색)로 이동했습니다. 그래서 다음으로 이동했습니다./test
화면에 테스트가 표시되었습니다.요. 무슨 말인지 요.app.router
있습니다. 제 코드에 포함되어 있든 없든, 제 라우팅은 괜찮습니다.그래서 저는 분명히 무언가를 놓치고 있습니다.
제 질문은 이렇습니다.
좀 해주시겠어요?app.router
중요성과 미들웨어 호출에서 어느 위치에 배치해야 합니까?또한 제가 간단한 설명을 듣는다면 좋을 것입니다.express.static()
제가 알기로는express.static()
는 내 정보의 캐시이며, 응용 프로그램이 요청된 페이지를 찾을 수 없는 경우 캐시가 있는지 확인합니다.
참고: 여기에서는 Express가 버전 2와 3에서 어떻게 작동했는지 설명합니다.Express 4에 대한 자세한 내용은 이 게시물의 끝을 참조하십시오.
static
디스크에서 파일(정적 리소스)을 제공합니다.경로(마운트 포인트라고도 함)를 지정하면 해당 폴더의 파일을 제공합니다.
를 들면, 들면를예,express.static('/var/www')
해당 폴더에 있는 파일을 처리할 수 있습니다.을 하세요.http://server/file.html
도움이 될 것입니다/var/www/file.html
.
router
경로를 실행하는 코드입니다.을 할 때는.app.get('/user', function(req, res) { ... });
은 그은것입니다.router
요청을 처리하기 위해 콜백 함수를 실제로 호출합니다.
에게 물건을 .app.use
각 미들웨어에 요청 처리 기회가 부여되는 순서를 결정합니다.를 들어, 예들다같음은있라는 이 있다면,test.html
사용자의 정적 폴더 및 경로:
app.get('/test.html', function(req, res) {
res.send('Hello from route handler');
});
것인가를 요청하는 것입니다.http://server/test.html
제공되는 미들웨어는 무엇이든use
이 작업을 수행할 경우:
app.use(express.static(__dirname + '/public'));
app.use(app.router);
그러면 디스크에 있는 파일이 제공됩니다.
반대로 하면,
app.use(app.router);
app.use(express.static(__dirname + '/public'));
그러면 경로 처리기가 요청을 받고 "경로 처리기에서 안녕"이 브라우저로 전송됩니다.
일반적으로 라우터를 정적 미들웨어 위에 배치하여 실수로 이름이 지정된 파일이 경로 중 하나를 재정의하지 못하도록 합니다.
명시적으로 설명하지 않을 경우use
그자리의 router
하는 시점에 에 의해 암시적으로 됩니다. 를 달았음에도 작동했습니다.app.use(app.router)
).
한 논평가가 다음 순서에 대해 또 다른 요점을 제기했습니다.static
그리고.router
앱의 전반적인 성능에 미치는 영향에 대해서는 언급하지 않았습니다.
의 또 다른 use
router
이상의static
성능을 최적화하는 것입니다. ,static
먼저 요청할 때마다 하드 드라이브를 눌러 파일의 존재 여부를 확인합니다.빠른 테스트를 통해 이 오버헤드가 언로드된 서버에서 ~1ms에 달한다는 것을 알게 되었습니다. (이 수치는 로드 시 Disk 액세스를 위한 요청이 경합할 가능성이 매우 높습니다.)
와 함께router
첫째, 경로와 일치하는 요청은 디스크에 도달할 필요가 없으므로 귀중한 밀리초를 절약할 수 있습니다.
물론, 그들을 완화시킬 수 있는 방법들이 있습니다.static
의 머리 위.
은 모든 /static
그런 다음 마운트할 수 있습니다.static
가 경가다로로 되도록 그 합니다./static
:
app.use('/static', express.static(__dirname + '/static'));
이 상황에서, 당신은 이것을 위에 놓았을 것입니다.router
이렇게 하면 파일이 있는 경우 다른 미들웨어/라우터를 처리하는 것을 피할 수 있지만, 솔직히 말해서 그렇게 많은 이득을 얻을 수 있을 것 같지는 않습니다.
또한 일반적으로 요청되는 파일을 디스크에 저장할 필요가 없도록 정적 리소스를 메모리에 캐시하는 를 사용할 수도 있습니다. (경고: staticCache
나중에 제거될 것으로 보입니다.)
하지만, 나는 생각하지 않습니다.staticCache
부정적인 답변(파일이 없는 경우)을 캐시하므로 입력해도 도움이 되지 않습니다.staticCache
이상의router
경로에 장착하지 않고.
성능에 대한 모든 질문과 마찬가지로 실제 애플리케이션(부하가 있는 경우)을 측정하고 벤치마크하여 병목 현상이 실제로 어디에 있는지 확인합니다.
익스프레스 4
Express 4.0 제거 app.router
미들웨어middleware)app.use
및 ) 및경로(경()app.get
등)은 이제 추가된 순서대로 정확하게 처리됩니다.
즉, 다음과 같습니다.
모든 라우팅 메서드는 나타나는 순서대로 추가됩니다.그러면 안 됩니다.
app.use(app.router)
이렇게 하면 Express에서 가장 일반적인 문제가 제거됩니다.다른 말로 하면,
app.use()
그리고.app[VERB]()
호출된 순서대로 정확하게 작동합니다.app.get('/', home); app.use('/public', require('st')(process.cwd())); app.get('/users', users.list); app.post('/users', users.create);
Express 4의 변경 사항에 대해 자세히 알아보십시오.
라우팅은 응용 프로그램이 URI(또는 경로) 및 특정 HTTP 요청 방법(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 응답하는 방법을 결정하는 것을 의미합니다.각 경로에는 경로가 일치할 때 실행되는 하나 이상의 처리기 기능이 있을 수 있습니다.
Express 4.0 라우터에서는 경로를 정의할 때 그 어느 때보다 유연하게 사용할 수 있습니다.
표현.라우터()는 경로 그룹을 정의하는 데 여러 번 사용됩니다.
요청을 처리하는 미들웨어로 사용되는 경로입니다.
".param"을 사용하여 매개 변수의 유효성을 검사하는 미들웨어로 사용되는 경로입니다.
app.route()는 라우터에 대한 바로 가기로 사용되어 한 경로에 여러 요청을 정의합니다.
우리가 app.route를 사용할 때 우리는 그 라우터에 우리의 앱을 첨부합니다.
var express = require('express'); //used as middleware
var app = express(); //instance of express.
app.use(app.router);
app.use(express.static(__dirname + '/public')); //All Static like [css,js,images] files are coming from public folder
app.set('views',__dirname + '/views'); //To set Views
app.set('view engine', 'ejs'); //sets View-Engine as ejs
app.engine('html', require('ejs').renderFile); //actually rendering HTML files through EJS.
app.get('/', function (req, res) {
res.render('index');
})
app.get('/test', function (req, res) {
res.send('test')
})
Express Version 4에서는 다음과 같은 방법으로 경로를 쉽게 정의할 수 있습니다.
server.js:
const express = require('express');
const app = express();
const route = require('./route');
app.use('/route', route);
// here we pass in the imported route object
app.listen(3000, () => console.log('Example app listening on port 3000!'));
route.js:
const express = require('express');
const router = express.Router();
router.get('/specialRoute', function (req, res, next) {
// route is now http://localhost:3000/route/specialRoute
});
router.get('/', function (req, res, next) {
// route is now http://localhost:3000/route
});
module.exports = router;
server.js
는 우는라객가다니습져의 라우터 .route.js
합니다.server.js
:
app.use('/route', route);
이모든경가의 route.js
URL은 과 같습니다. 기본 URL은 "URL"입니다.
이러한 접근 방식을 사용해야 하는 이유:
이러한 접근 방식의 주요 이점은 이제 앱이 더 모듈화되었다는 것입니다.이제 특정 경로에 대한 모든 경로 핸들러를 다른 파일에 넣을 수 있으므로 모든 것을 보다 쉽게 유지 관리할 수 있습니다.
모듈화를 입증하기 위한 목적으로 2016년 @kelyvinn이 작성한 기사에는 다음 코드가 포함되어 있습니다.
// controllers/apis/dogs/index.js
const
express = require('express'),
dogService = require('../../../services/dogs');
let router = express.Router();
router.get('/', dogService.getDogs);
router.get('/:id', dogService.getDogWithId);
module.exports = router;
언급URL : https://stackoverflow.com/questions/12695591/node-js-express-js-how-does-app-router-work
'programing' 카테고리의 다른 글
보안 웹 서비스에도 액세스하는 iOS 앱에서 Facebook 인증을 위한 설계 (0) | 2023.05.13 |
---|---|
특정 길이의 하위 목록을 인쇄하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
"스크립트 실행" 빌드 단계를 릴리스 구성으로 제한하려면 어떻게 해야 합니까? (0) | 2023.05.13 |
git: 치명적:저는 'http' 프로토콜을 처리하지 않습니다. (0) | 2023.05.13 |
Postgres에서 두 필드의 MIN()을 얻으려면 어떻게 해야 합니까? (0) | 2023.05.13 |