당연히 Node.js도 쟝고와 완벽히 똑같은 기능을 수행하는 만큼, 들어오는 페이지에 따라 라우팅 기능도 구현할 수 있다.
전 포스트를 봤다면 알다시피, createServer의 요청값 중에 어떤 url로 요청을 보냈는지 확인할 수 있는 req.url이 있었다. 이를 통해 특정 url일 때 다른 html 페이지를 렌더링해줄 수 있도록 조치할 수 있다.
const http = require('http');
const server = http.createServer((req,res) => {
const url = req.url;
if (url === "/") {
res.write('<html>')
res.write('<head><title>First Page</title></head>')
res.write('<body><form action="/message" method="POST"><input type="text" name="message"><button type="sumbit"></button></form></body>')
res.write('</html>')
return res.end(); // return 하지 않을 경우 아래 구문도 함께 실행되므로 return 문 실행
}
res.write('<html>')
res.write('<head><title>First Page</title></head>')
res.write('<body><h1>Hello world!</h1></body>')
res.write('</html>')
res.end();
})
server.listen(3000);
아무것도 요청하지 않았을 때 url은 "/"으로 정의되므로, 위의 form 태그와 관련된 HTML 코드가 실행된다. form 태그에 있는 action은 button 에 있는 type=submit 버튼이 눌렸을 때, 안에 있는 데이터들이 어디로 이동될지에 대한 최종 url 주소를 의미한다. 하지만 우리는 /message에 대한 url에 대해 정의가 되어있지 않으므로 기본적인 html 코드를 ("Hello world!")를 보여주게 된다.
그 안에 있는 input에는 name="message"라고 되어있는데, 나중에 이 데이터를 받는 서버측에서 name에 정의된 이름으로 데이터를 받게 되므로 아이디나 패스워드 같은 경우 정의를 해주는 것이 편리할 것이다.
const http = require('http');
const fs = require('fs'); //로컬 파일 시스템과 관련된 모듈
const server = http.createServer((req,res) => {
const url = req.url;
const method = req.method;
if (url === "/") {
res.write('<html>')
res.write('<head><title>First Page</title></head>')
res.write('<body><form action="/message" method="POST"><input type="text" name="message"><button type="sumbit"></button></form></body>')
res.write('</html>')
return res.end();
}
if (url === "/message" && method === "POST") {
fs.writeFileSync('message.txt','Dummy');
res.statusCode = 302;
res.setHeader('Location','/'); // url "/"로 리디렉션
return res.end();
}
res.write('<html>')
res.write('<head><title>First Page</title></head>')
res.write('<body><h1>Hello world!</h1></body>')
res.write('</html>')
res.end();
})
server.listen(3000);
writeFile => 비동기적으로 수행
writeFileSync => 동기적으로 수행
두 함수 모두 첫 인자로는 총 3개의 인자를 받는데, file경로, 입력할 데이터, 옵션(인코딩 방법, mode, flag) 등을 정의받는다.
마지막 두 번째 인자는 콜백함수인데, 에러에 대한 메시지를 출력하거나 성공했을 때 사용할 수 있다.
fs.writeFileSync('message.txt','Dummy',(err) => {
if(err) {
alert(err);
} else {
console.log("file written successfully")
}
});