기존의 상세보기 구현 코드 (파일을 통해 글을 관리하는 방식)
fs.readdir
db.query(
SELECT * FROM topic, function(error,topics){}
홈화면에서 글목록을 가져오는 코드를 그대로 사용하면 된다.
db.query(`SELECT * FROM topic`, function(error,topics){
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(topics);
var html = template.HTML(title, list,
`<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
});
SELECT * FROM topic WHERE id=3;
db.query(
SELECT * FROM topic WHERE id=?,[queryData.id], function(error2, topic){}
queryData.id
: URL의 queryString의 id값을 가져와서 쿼리문에 사용하기상세보기 페이지의 구현 순서는 다음과 같다
1. 글 목록을 가져온 뒤,
2. id값을 통해 해당하는 글의 정보를 가져오고
3. 상세보기 화면을 구현하기
여기서 글 데이터를 가져오지 못할 경우에 error를 처리해주기 위해
if(error){
throw error;
}
에러를 탐지하자마자 즉시 애플리케이션을 종료시킨다.
이렇게 순서와 에러처리를 구현한 코드는 다음과 같다
db.query(`SELECT * FROM topic`, function(error,topics){
if(error){
throw error;
}
db.query(`SELECT * FROM topic WHERE id=${queryData.id}`, 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>${title}</h2>${description}`,
` <a href="/create">create</a>
<a href="/update?id=${queryData.id}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${queryData.id}">
<input type="submit" value="delete">
</form>`
);
response.writeHead(200);
response.end(html);
})
});
topic[0]
식으로 인덱스를 지정해줌을 통해 배열의 요소인 객체에 접근해야 한다.db.query(`SELECT * FROM topic WHERE id=${queryData.id}`, function(~){});
데이터베이스가 가지는 코드 특성에 따라 사용자의 입력으로 인해 공격받을 수 있다.
따라서 id값이 들어가야할 자리에 ?
를 적어주고, ?
에 어떤 값이 들어가야할 지는 그 다음의 인자에 작성하여 분리시켜준다
db.query(SELECT * FROM topic WHERE id=?`,[queryData.id],function(~){});
상세화면에 구현될 글 생성, 글 수정, 글 삭제 링크도 마저 구현한다.
<a href="/create">create</a>
<a href="/update?id=${queryData.id}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${queryData.id}">
<input type="submit" value="delete">
</form>
fs.readdir('./data', function(error, filelist){
var title = 'WEB - create';
var list = template.list(filelist);
var html = template.HTML(title, list, `
<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>
`, '');
response.writeHead(200);
response.end(html);
});
db.query(`SELECT * FROM topic`, function(error,topics){
var title = 'Create';
var list = template.list(topics);
var html = template.HTML(title, list,
`<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
<input type="submit">
</p>
</form>`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
});
create_process
웹서버에서
submit 버튼을 클릭 했을 때 실행돼야하는 쿼리문
INSERT INTO topic (title, description, created, author_id) VALUES('제목', '본문', NOW(), 1);
INSERT INTO topic (title, description, created, author_id) VALUES(?, ?, NOW(), ?)`,[post.title, post.description, 1]
function(error, result){
if(error){
throw error;
}
response.writeHead(302, {Location: `/?id=${result.insertId}`});
response.end();
}
여기서
방금 삽입한 데이터의 id값을 불러와야 한다.
result.insertId
callback function의 result인자에 담기는 결과값의 insertId property에 접근하면 된다.