NodeJS 프레임 워 크 express 의 경로 맵(경로)기능 및 제어

7478 단어 nodejsexpress
Express 는 NodeJS 를 기반 으로 하 는 매우 우수한 서버 개발 프레임 워 크 라 는 것 을 알 고 있 습 니 다.이 CSSer 는 express 프레임 워 크 의 route 와 route control 장 을 제공 할 것 입 니 다.route 는 클 라 이언 트 가 요청 한 URL 의 경로 맵 기능 을 실현 하고 경로 나 URL 맵 으로 잠시 번역 합 니 다.만약 네가 여전히 그다지 이해 하지 못 한다 면,이 문장 을 다 읽 으 면 약간의 수확 이 있 을 것 이 라 고 믿는다.
경로(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 는 왜 사용 합 니까?
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기