본문 바로가기

BackEnd/Express.js

Express Basic Essentials - Route

Express Route

 

Express 에서 라우터는 특별한 미들웨어 이다.

다른 미들웨어가 connect를 상속받는 반면 라우터는 express 자체를 상속받아

구현한다.

익스프레스 라우터는 HTTP 요청 함수 에 기반한 거의 모든 함수를 지원하는데

LIKE 나 UNLIKE 같이 불안정하고 모호한것은 아직 지원하지 않는다.

HTTP 요청 함수는 여러가지가 있지만 웹개발을 하면서 우리가 많이 사용하는것과

사용하지 않는것으로 나눠보면 다음과 같다.

많이 사용

GET, POST, PUT, DELETE

많이 사용 안함

HEAD,TRACE,OPTIONS,CONNECT,PATCH,M-SEARCH,NOTIFY,SUBSCRIBE

이런 요청 함수들을 라우터는 소문자로 구현해 놓았는데 express 가 가진

고유한 함수중에 all 이라는 함수가 있다.

이함수는 모든 요청 함수에 대한 요청을 감지 하기위해 만들어 졌다.

사용은 다음과 같이 하면된다.

app.get('/' ,callback)
app.post('/',callback)
app.put('/' ,callback)
//all function
app.all('/',function(req, res, next) { 
        //do something.
        next();
    });

callback 은 app.all() 에 구현한 callback function 을 의미한다.

Identifier & Priority

식별자는 다음과 같이 사용할수 있다.

app.get('/ab?cd',callback) //example
 '/ab?cd' == '/acd'
 '/ab+cd' == '/abbcd'
 '/ab*cd' == '/abxyzcd'
 '/ab(cd)?e' == '/abe' || '/abcde'

우선순위에 경우 맨처음에 오는 라우터가 우선하지만 이를 스케쥴링 할수 있다.

    app.get('/abc', callback);
    app.get('/ab*', callback);

    app.get('/abc', function(req, res, next) {
            if (req.path == '/ab*') {
                next();
            }
            else {
                console.log('/abc');
            }
        });

Router handling

라우터는 요청에 대해서 단일 콜백을 하지만 다중콜백도 지원한다.

그러나 이방식은 권장하지 않는다.

한 요청에 복수에 처리를 할수있다는 정도만 알고있으면 언젠가 써먹을 일이 있을지도 모르겠다.

app.get('/',
          function(req,res,next) {
            res.set('Hello','World!');
            next();
        },function(req,res,next) {
            res.set('Hey','you!');
            next();    
        },function(req,res) {
            res.send('OK NOW TIME TO GO');    
        }
)
//배열 형태로 구현할수도 있다.
var one =  function(req,res,next) {
               res.set('Hello','World!');
               next();
        };
var two = function(req,res,next) {
             res.set('Hey','you!');
             next();    
        };

app.get('/'[one, two],function(req, res) {
            res.send('OK NOW TIME TO GO');    
    })

Router Structured

이번 포스팅에서 가장 중요한 내용이다.

라우터를 구조화 시키는 방법인데 3가지 방식이 보편적으로 많이 사용되며

개인적으론 네임 스페이스드 방식을 선호한다.

노드 모듈 사용

    // index.js  파일이 있다고 가정했을때 내부 코드는 다음과 같다
    exports.index = function(req, res) { res.send('welcome') };
    exports.list  = function(req, res) { res.send('Array') };

    // 이파일을 app.js에서  require 로 호출해서 다음처럼 사용한다
    var getRouters = require('./index.js');
    app.get('/',getRouters.index);
    app.get('/list',getRouters.list);

    // 여기서 한번더 모듈화를 진행한다. rootIndex.js 를 생성한다.
    var getRouters = require('./index.js');
    module.exports = function(app) {
      app.get('/',getRouters.index);
      app.get('/list',getRouters.list);
    }

    // app.js에서 라우터를 추가하고 즉시실행 함수 형태로 넘긴다.
    app.use(app.router);
    var routes = require('./rootIndex.js')(app);

네임 스페이스드 라우팅

    /articles/
    /articles/history
    /articles/history/:id
    /articles/news/
    /articles/news/:id

이러한 라우터를 정의해야 된다고 가정해보자

이 구조화 방법은 express-namespace 모듈을 필요로 한다.

    var namespace = require('express-namespace');
    var app = express();

    app.namespace('/articles', function() {
        app.get('/',callback)
        app.get('/history', callback)
        app.get('/history/:id', callback)
        app.namespace('/news'), function() {
            app.get('/', callback);
            app.get('/:id', callback);
        }
    })

리소스 요청 라우팅

리소스풀 라우팅도 많이 사용되는 구조화 방법중에 하나이며

이방법 역시 express-resource 라는 모듈을 필요로 한다.

  // index.js 를 다음과 같이 작성한다.
  exports.index = function(req, res){ ...}
  exports.new = function(req, res){ ...}
  exports.create = function(req, res){ ...}

  //app.js 를 다음과 같이 작성한다.
  var resource = require('express-resource');
  var app = express():
  app.resource('users', require('./index.js'));

다음과 같은 방식으로 리소스풀 라우트 핸들러를 로드하게 된다.

  /users/    (GET)
  /users/new (GET)
  /users     (POST)

다음 포스팅에서는 서버의 응답과 전송에 대해서 포스팅 하겠다.