NodeJS 프레임 워 크 express 의 경로 맵(경로)기능 및 제어
경로(URL 맵)
Express 는 HTTP 동작 을 이용 하여 의미 있 고 표 현 력 있 는 URL 맵 API 를 제공 합 니 다.예 를 들 어 사용자 계 정의 URL 을'/user/12'처럼 보이 고 싶 을 수도 있 습 니 다.아래 의 예 는 이러한 경 로 를 실현 할 수 있 습 니 다.그 중에서 자리 표시 자(본 예:id)와 관련 된 값 은 req.params 에서 얻 을 수 있 습 니 다.
app.get('/user/:id', function(req, res){
res.send('user ' + req.params.id);
});
위의 예 에서 우리 가/user/12 에 접근 할 때"user 12"를 되 돌려 줍 니 다.CSSer 주:app.get 은 서버 에 get 요청 사건 을 감청 하 는 디텍터 를 등록 한 것 과 같 습 니 다.요청 한 URL 이 첫 번 째 매개 변 수 를 만족 시 킬 때 뒤의 리 셋 함 수 를 실행 합 니 다.이 과정 은 비동기 입 니 다.루트 는 내부 에서 정규 표현 식 으로 컴 파일 할 수 있 는 간단 한 문자열 입 니 다.예 를 들 어/user/:id 가 컴 파일 된 후 내부 에서 컴 파일 된 정규 표현 식 문자열 은 아래 의 모양 으로 보일 것 입 니 다(간소화 후).
\/user\/([^\/]+)\/?
복잡 한 점 을 실현 하려 면 정규 표현 식 의 직접 양 을 입력 할 수 있 습 니 다.정규 포획 팀 은 익명 이기 때문에 req.params 를 통 해 접근 할 수 있 습 니 다.첫 번 째 포획 팀 은 req.params[0]이 고 두 번 째 는 req.params[1]입 니 다.
app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){
res.send(req.params);
});
Linux 의 curl 명령 을 통 해 우리 가 정의 한 경 로 를 테스트 합 니 다.
$ curl http://cssercom:3000/user
[null,null]
$ curl http://cssercom:3000/users
[null,null]
$ curl http://cssercom:3000/users/1
["1",null]
$ curl http://cssercom:3000/users/1..15
["1","15"]
다음은 예 와 일치 하 는 관련 경로 입 니 다.
"/user/:id"
/user/12
"/users/:id?"
/users/5
/users
"/files/*"
/files/jquery.js
/files/javascripts/jquery.js
"/file/*.*"
/files/jquery.js
/files/javascripts/jquery.js
"/user/:id/:operation?"
/user/1
/user/1/edit
"/products.:format"
/products.json
/products.xml
"/products.:format?"
/products.json
/products.xml
/products
"/user/:id.:format?"
/user/12
/user/12.json
또한,우 리 는 POST 방식 으로 json 데 이 터 를 제출 한 다음 에 body Parser 미들웨어 를 이용 하여 json 요청 체 를 분석 하고 json 데 이 터 를 클 라 이언 트 에 되 돌려 줄 수 있 습 니 다.
var express = require('express')
, app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
res.send(req.body);
});
app.listen(3000);
일반적으로 우리 가 사용 하 는 자리 표시 자(예 를 들 어/user/:id)는 아무런 제한 이 없습니다.즉,사용자 가 다양한 데이터 형식의 id 값 을 입력 할 수 있 습 니 다.만약 에 사용자 id 를 숫자 로 제한 하고 싶다 면'/user/:id(\d+)'라 고 쓰 면 이 자리 표시 자 데이터 형식 이 수치 형식 이 어야 만 경로 의 관련 처 리 를 할 수 있 습 니 다.경로 제어
하나의 응용 프로그램 에서 여러 개의 경 로 를 정의 할 수 있 습 니 다.우 리 는 다음 경로 로 전환 하 는 것 을 제어 할 수 있 습 니 다.Express 는 세 번 째 매개 변수 인 next()함 수 를 제공 합 니 다.하나의 패턴 이 일치 하지 않 을 때 통 제 는 Connect(Express 는 Connect 모듈 기반)로 돌아 가 고 미들웨어 는 use()에 추 가 된 순서에 따라 계속 실 행 됩 니 다.여러 정의 경로 가 같은 URL 과 일치 할 수 있 을 때 도 마찬가지 입 니 다.특정한 경로 가 next()를 호출 하지 않 고 응답 을 클 라 이언 트 에 출력 하지 않 는 한 순서대로 실 행 됩 니 다.
app.get('/users/:id?', function(req, res, next){
var id = req.params.id;
if (id) {
// : , URL
} else {
next(); // URL
}
});
app.get('/users', function(req, res){
// do something else
});
app.all()방법 은 모든 HTTP 동작 에 단일 호출 입 구 를 적용 할 수 있 습 니 다.이것 은 어떤 경우 에 유용 합 니 다.다음은 이 기능 을 사용 하여 아 날로 그 데이터베이스 에서 사용 자 를 불 러 오고 req.user 에 할당 합 니 다.
var express = require('express')
, app = express.createServer();
var users = [{ name: 'www.csser.com' }];
app.all('/user/:id/:op?', function(req, res, next){
req.user = users[req.params.id];
if (req.user) {
next();
} else {
next(new Error('cannot find user ' + req.params.id));
}
});
app.get('/user/:id', function(req, res){
res.send('viewing ' + req.user.name);
});
app.get('/user/:id/edit', function(req, res){
res.send('editing ' + req.user.name);
});
app.put('/user/:id', function(req, res){
res.send('updating ' + req.user.name);
});
app.get('*', function(req, res){
res.send('what???', 404);
});
app.listen(3000);
경로 매개 변수 예비 처리경로 매개 변수 예비 처 리 는 암시 적 데이터 처 리 를 통 해 응용 코드 의 가 독성 과 요청 URL 의 검증 을 대폭 향상 시 킬 수 있 습 니 다.만약 당신 이 자주 몇 개의 경로 에서 일반적인 데 이 터 를 얻 게 된다 면,예 를 들 어/user/:id 를 통 해 사용자 정 보 를 불 러 옵 니 다.보통 우 리 는 이렇게 할 수 있 습 니 다.
app.get('/user/:userId', function(req, res, next){
User.get(req.params.userId, function(err, user){
if (err) return next(err);
res.send('user ' + user.name);
});
});
예비 처리 후 매개 변 수 를 리 셋 함수 에 매 핑 하여 검증,강제 적 인 변경 값,심지어 데이터 베이스 에서 데 이 터 를 불 러 오 는 등 기능 을 제공 할 수 있 습 니 다.다음은 app.param()을 호출 하여 중간 부품 에 비 추 기 를 원 하 는 인 자 를 입력 합 니 다.자리 표시 자(:userId)값 을 포함 하 는 id 인 자 를 받 은 것 을 볼 수 있 습 니 다.이 곳 에 서 는 평소 와 같이 사용자 데이터 로드 와 오류 처 리 를 할 수 있 으 며,next()를 통 해 제어 권 을 다음 전처리 나 경로(경로 제어)로 간단하게 전환 할 수 있 습 니 다.
app.param('userId', function(req, res, next, id){
User.get(id, function(err, user){
if (err) return next(err);
if (!user) return next(new Error('failed to find user'));
req.user = user;
next();
});
});
이렇게 하면 위 에서 언급 한 경로 의 가 독성 을 크게 향상 시 킬 뿐만 아니 라 전체 응용 에서 이 부분의 논리 적 실현 을 공유 하여 재 활용 목적 을 달성 할 수 있다.
app.get('/user/:userId', function(req, res){
res.send('CSSer ' + req.user.name);
});
간단 한 경우,예 를 들 어 루트 차지 문자 검증 과 강제 변경 값 은 1 개의 인자(1 개의 인자 지원)만 입력 하면 되 며,그 동안 던 진 이상 은 자동 으로 next(err)로 전 달 됩 니 다.
app.param('number', function(n){ return parseInt(n, 10); });
또한 리 셋 함 수 를 여러 개의 자리 표시 자 에 동시에 적용 할 수 있 습 니 다.예 를 들 어 경로/commits/:from-:to 의 경우:from 과:to 는 모두 수치 형식 입 니 다.우 리 는 그것들 을 배열 로 정의 할 수 있 습 니 다.
app.param(['from', 'to'], function(n){ return parseInt(n, 10); });
결어본 논문 의 학습 을 통 해 우 리 는 느 낄 수 있 을 것 입 니 다.NodeJS 는 우리 제품 의 서버 논 리 를 실현 할 수 있 을 뿐만 아니 라 자 바스 크 립 트 를 이용 하여 서버 프로 그래 밍 도 할 수 있 습 니 다.주 의 는 서버 입 니 다.즉,우 리 는 자 바스 크 립 트 를 이용 하여 예전 에 apache 에서 만 할 수 있 었 던 기능 을 맞 출 수 있 습 니 다.NodeJS 는 rewrite 가 더 필요 합 니까?경로 맵 이 더 간단 하고 강력 한데 rewrite 는 왜 사용 합 니까?
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Node.js를 AWS서버에서 사용하는 실습간단한 예제와 함께 AWS에서 Node.js를사용하는 법을 배워보도록 하겠다. 해당 github에 있는 레포지토리로 사용을 할 것이다. 3000번 포트로 Listen되는 예제이고 간단히 GET, POST, DELET...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.