보면서 눈에 띄는 것 만 대충 정리함.
http://www.nodebeginner.org/index-kr.html
Node.js
- server side JavaScript
: Server side JavaScript 실행환경과 라이브러리로 이루어져 있음.
- Event driven callbacks
: event에 대한 callback을 등록하여 처리 하도록 함.
각 event 상황에 대해서 처리하도록 callback을 등록하여 단순해 지지만
callback 내에서 과도한 operation을 처리할 경우 성능 문제 발생 가능
http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb
[Documentation에서 설명하는 기본 use scenario]
- 웹페이지 제공 => HTTP 서버가 필요.
- 서버는 어떤 URL 요청(request)에 응답 => 요청과 요청을 처리할 핸들러들을 위한 라우터(router) 필요.
- 서버로 도착한 요청 처리 => 요청 핸들러(request handlers)가 필요.
- 라우터에서의 POST 데이터 처리, request handler 들에게 넘기기 위한 request 가공 => 요청 데이터 핸들링(request data handling)이 필요.
- URL 요청 시 내용 표시 => request handler 들이 사용자 브라우저로 콘텐트를 보내기 위해 사용할 수 있는 뷰 로직(view logic)이 필요.
- 이미지들을 업로드 => 업로드 핸들링(upload handling)이 필요.
[Hello world example]
server.js
var http = require("http"); function start() { function onRequest(request, response) { console.log("Request received."); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start;http server를 사용해서 hello world를 만들 것이므로
require로 http 모듈을 사용할 수 있도록 함.
http server 모듈의 request event를수신했을 때 response로
text/plain content type으로 "hello world"를 전송함.
http://nodejs.org/api/http.html#http_class_http_server
exports는 함수를 외부에서 사용할 수 있도록 할 때 사용.
index.js
var server = require("./server"); server.start();다른 js파일을 내장 모듈 불러오듯 require를 사용해서 불러오고 export된 함수를 사용.
[request 정보 확인 for route]
url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- ----- | | | | querystring(string)["foo"] | | querystring(string)["hello"]
request의 method, path, query 들을 확인하여 적절한 handler에서 처리하기 위해 필요한 함수들
request handler들을 path에 따라 등록하고 route하는 예제
var http = require("http"); var url = require("url"); function start(route, handle) { function onRequest(request, response) { var pathname = url.parse(request.url).pathname; console.log("Request for " + pathname + " received."); route(handle, pathname); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); } exports.start = start;기본 hello world server에서 변경된 점은
url의 pathname을 확인하여 route하는 루틴이 포함된 점이다.
간단한 예제라 route의 결과를 가지고 response를 보내는 것이 구현되어 있지는 않음.
function route(handle, pathname) { console.log("About to route a request for " + pathname); if (typeof handle[pathname] === 'function') { handle[pathname](); } else { console.log("No request handler found for " + pathname); } } exports.route = route;hanlder들 중에서 pathname의 key를 가진 function object를 찾아서 실행함.
var server = require("./server"); var router = require("./router"); var requestHandlers = require("./requestHandlers"); var handle = {} handle["/"] = requestHandlers.start; handle["/start"] = requestHandlers.start; handle["/upload"] = requestHandlers.upload; server.start(router.route, handle);url path에 따른 handler들을 매핑한 뒤
server로 router와 handle을 넘겨서 시작함.
[TODOs]
- understanding node.js : http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb
- dependency injection pattern : http://martinfowler.com/articles/injection.html
- function programming 관련 : http://steve-yegge.blogspot.kr/2006/03/execution-in-kingdom-of-nouns.html
댓글 없음:
댓글 쓰기