Node.js에서 Router를 통해 URL에 따라 다른 response 보내기
// requestHandler.js
function main(response) {
response.writeHead(200, { "Content-Type": "text/html" });
response.write("Main Page");
response.end();
}
function login(response) {
response.writeHead(200, { "Content-Type": "text/html" });
response.write("Login Page");
response.end();
}
let handle = {};
handle["/"] = main;
handle["/login"] = login;
exports.handle = handle;
먼저 url에 따라 다른 response를 보내는 역할을 담당하는 requestHandler.js를 만든다.
handle 이라는 변수에 key, value를 저장할 수 있도록 해주고
"/"는 main,
"/login"는 login으로 연결되도록 한다.
만약 다른 url을 추가하여 처리하고 싶다면 handle과 함수를 추가해주면 된다.
이제 handle을 통해 url이 "/"라면 main을, "/login"이라면 login을 반환할 수 있다.
// index.js
let server = require("./server");
let router = require("./router");
let requestHandler = require("./requestHandler");
server.start(router.route, requestHandler.handle);
index.js에서 requestHandler를 정의한 후 server.js에 requesetHandler.handle을 전달해준다.
// server.js
let http = require("http");
let url = require("url");
function start(route, handle) {
function onRequest(request, response) {
let pathname = url.parse(request.url).pathname;
route(pathname, handle, response);
}
http.createServer(onRequest).listen(8888);
}
exports.start = start;
server.js에서 route()함수에 현재 url 주소인 pathname, 그리고 handle, response 3가지를 전달해준다.
// router.js
function route(pathname, handle, response) {
if (typeof handle[pathname] == "function") {
handle[pathname](response);
} else {
response.writeHead(404, { "Content-Type": "text/html" });
response.write("This page could not be found");
response.end();
}
}
exports.route = route;
route에서는 pathname을 handle에 넣었을 때 나온 값에 따라 어떤 행동을 취할지를 결정한다.
만약 handle[pathname]의 타입이 function이라면, 그에 맞는 함수(main() 또는 login())를 호출한다.
그렇지 않다면, statuscode 404와 함께 페이지를 찾을 수 없다는 response를 전달한다.
먼저 기본 url인 "/"에 접속하였을 때이다.
Main Page가 잘 나오는 것을 확인할 수 있다.
다음으로 "/login"에 접속하였을 때이다.
Login Page가 잘 나오는 것을 확인할 수 있다.
"/" 또는 "/login"이 아닌 다른 url에 접속하는 경우이다.
페이지를 찾을 수 없다는 문구가 잘 나오는 것을 확인할 수 있다.