Node JS Web Express framwork
Node Express 활용
우선 npm에서 expree -S 으로 install 해준 후 프로젝트에 의존성을 주입해 준다.
"dependencies": {
"express": "^4.17.1",
"mysql": "^2.18.1",
"sanitize-html": "^2.3.0"
}
그후 모듈을 가져와서 사용 하면 되는데, 이전에 main.js에서 코딩했던 내용을 리펙토링하여 expree를 적용하도록 하였다.
모듈 가져오기
const express = require('express')//모듈을 가져온다
const app = express(); //app에 모듈의 함수를 넣어준다
아까 express를 넣어준 app을 활용하여 get, post의 방식으로 라우팅이 가능하다. 그후 response.send를 통해 브라우저에 데이터를 넘길 수 있다.
//route, routing 길을 찾게 해준다.
app.get('/',(req,res)=>res.send('Hello world'))
//아래와 같은 문법
app.get('/',function(req,res){
return res.send('Hello World')
})
이후 3000번 포트에 리스너를 사용하여 해당 포트에 반응하도록 설정한다.
//3000 번 포트일때 반응하도록 설정
app.listen(3000)
아래는 이전 if 문으로 조건을 걸어 라우팅을 했던 main.js를 express 프레임워크를 사용하여 리펙토링한 코드 이다.
app.get('/',(req,res)=>topic.home(req, res));
//page 경로와 그에 따른 id를 받을 수 있게 설정
app.get('/page/:pageId',(req,res) =>topic.page(req, res));
// /page/:pageId로 설정하게 되면 request.params.pageId를 통해 page/뒤에오는 값을 얻을 수 있다.
app.get('/create',(req,res)=>topic.create(req, res));
app.post('/create_process',(req,res)=>topic.create_process(req, res));
app.get('/update/:pageId',(req,res)=>topic.update(req, res));
app.post('/update_process',(req,res)=>topic.update_process(req, res));
app.post('/delete_process',(req,res)=>topic.delete_process(req, res));
여기서 페이지를 라우팅 해주는 방식이 변경되었으므로 topic.js 와 template.js에 수정이 필요하다.
template.js의 list 부분 수정
list: function (topics) {
var list = "<ul>";
var i = 0;
while (i < topics.length) {
//페이지를 이동하는 방식이 /page/id 로 변경되었으므로 바꿔준다.
list += `<li><a href="/page/${topics[i].id}">${sanitizeHtml(topics[i].title)}</a></li>`;
i++;
}
list = list + "</ul>";
return list;
}
topic.js의 페이지 부분과 업데이트 부분에 id값을 가져오는 부분을 수정해준다.
exports.page = function (request, response) {
// var _url = request.url;
// var queryData = url.parse(_url, true).query;
//main에서 설정해준 경로를 통해 /page/:pageId의 값을 받도록 설정
var pi = path.parse(request.params.pageId).base;
db.query(`SELECT *FROM topic`, function (error, topics) {
if (error) {
throw error;
}
//쿼리문을 작성할 때 ? 로 이용해서 공격적인 인젝션에서 방어할 수 있다. 배열의 순서대로 문자열로 들어가기 때문에(url에 sql injection을 사용하여 테이블을 삭제하거나 그런 행위)
db.query(
`SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id WHERE topic.id =?`,
[pi],//?에 값을 넣어줄 부분에 pi를 넣어준다.
function (error2, topic) {
if (error2) {
throw error2;
}
var title = topic[0].title;
var description = topic[0].description;
var list = template.list(topics);
var html = template.html(
title,
list,
`<h2>${sanitizeHtml(title)}</h2>${sanitizeHtml(description)}
<p>by ${sanitizeHtml(topic[0].name)}</p>
`,
`<a href="/create">create</a> <a href="/update/${pi}">update</a>
<form action="/delete_process" method="post">
<input type="hidden" name="id" value="${pi}">
<input type="submit" value="delete">
</form>`
);
response.send(html);
}
);
});
};
exports.update = function (request, response) {
// var _url = request.url;
// var queryData = url.parse(_url, true).query;
//main에서 설정해준 경로를 통해 /page/:pageId의 값을 받도록 설정
var pi = path.parse(request.params.pageId).base;
db.query(`SELECT * FROM topic`, function (error, topics) {
if (error) {
throw error;
}
db.query(
`SELECT * FROM topic WHERE id =?`,
[pi], //?에 값을 넣어줄 부분에 pi를 넣어준다.
function (error2, topic) {
if (error2) {
throw error2;
}
db.query(`SELECT * FROM author`, function (error2, authors) {
var list = template.list(topics);
var html = template.html(
sanitizeHtml(topic[0].title),
list,
`<form action="/update_process" method="post">
<input type="hidden" name="id" value="${topic[0].id}"
<p><input type="text" name ="title" placeholder="title" value="${
sanitizeHtml(topic[0].title)
}"></p>
<p><textarea name="description" placeholder="description">${
sanitizeHtml(topic[0].description)
}</textarea></p>
<p>
${template.authorSelct(authors, topic[0].author_id)}
</p>
<p><input type="submit"></p>`,
`<a href="/create">create</a> <a href="/update/${topic[0].id}">update</a>`
);
response.send(html);
});
}
);
});
};