2016년 4월 11일 월요일

점진적 방법으로 async web server 만들기 - node.js

최소 라이브러리만 가지고 접근

require('http').createServer(function(req,res) {
  console.log(req.url, req.method);
  res.end(req.url+":"+req.method);
}).listen(3000);

# coffee
require('http').createServer((req,res)-> res.end "#{req.url}:#{req.method}").listen 3000

Router를 만들자.
if 나 switch 를 쓰는 것보다 object를 이용하자.
해당 패턴이 있으면 쓰고 없으면 404 처리를 하자.

var router={
  "/": function() {
    return "home";
  },
  "/list": function() {
    return "list";
  },
  "404": function() {
    return "not found";
  }
}

require('http').createServer(function(req,res) {
  res.end(router[router[req.url] && req.url || "404"]());
}).listen(3000);

# coffee
router =
  "/": -> "home"
  "/list": -> "list"
  "404": -> "not found"
require('http').createServer((req, res) ->
  res.end router[router[req.url]? and req.url or '404']()
).listen 3000

만일 Async가 있다면?

router = {
  "/" : function(act) {
    return function() {
      act("hello home");
    };
  },
  "/list": function(act) {
    return function() {
      setTimeout(function() {
        act("list");
      }, 1000);
    };
  },
  "404": function(act) {
    return function() {
     act("not found");
    };
  }
};
http.createServer(function(req, res) {
  router[router[req.url] && req.url || "404"](function(body) {
    res.end(body);
  })();
}).listen(3000);

# coffee
router =
  '/': (act) ->
    -> act 'hello home'
  '/list': (act) ->
    -> setTimeout (->
      act 'list'
    ), 1000
  '404': (act) ->
    -> act 'not found'
http.createServer((req, res) ->
  router[router[req.url]? and req.url or '404']((body) ->
    res.end body
  )()
).listen 3000

마지막에 res.end 를 해야하므로 최종적으로 비동기 작업을 끝내고 res.end를 하도록 함수를 리턴해야한다.

/list/:id 와 같은 패턴 매칭을 하려면?

params="/list/:id".match(/:([^\/]+)/g).map(v=>v.substr(1))

이런 식으로 접근해서 인자명을 뽑아둔다.
패턴을 생각해보자.

테스트는 이렇게 해본다.
웹브라우저에서도 해볼 수 있지만 

$ curl localhost:3000/list

이렇게 하거나 curl 이 없으면

$ telnet localhost 3000
혹은
$ nc localhost 3000
을 실행하여
GET /list 
입력 후 엔터 두번 해준다.