앞에 글에서 에디터를 만들었으므로 이제 본격적으로 글 작성 수정 삭제 기능을 구현할 겁니다.
우선 SQL서버에 post 테이블을 만들어줍니다.
post는 id, category, title, written time, body, views 열을 만들어줬습니다.
우선 write.pug 파일 맨 아래에 submit타입의 인풋을 만들어 작성 버튼을 만들어줍니다.
그리고 routes폴더 아래의 post.js 파일에서 write라우트를 하나 아래와 같이 만들어줍니다.
router.post('/write', (req, res) => {
if (CheckAuth(req, res)) {
let category = req.database.escape(req.body.category);
let title = req.database.escape(req.body.title);
let body = req.database.escape(req.body.body);
req.database.query(
'INSERT INTO post (category, title, writtentime, body, views)' +
`VALUES (${category}, ${title}, '${moment().format()}', ${body}, 0);`,
(err, result) => {
if (err) throw err;
console.log(req.body);
res.status(200).redirect(`/post/${result.insertId}`);
}
);
}
});
이러면 req오브젝트에 quill에디터의 본문이 저장되지 않으므로 quill-write,js 파일에서 아래 코드를 추가해줍니다.
let form = document.querySelector('form');
form.onsubmit = function () {
// Populate hidden form on submit
let about = document.querySelector('input[name=body]');
about.value = JSON.stringify(quill.getContents());
console.log(about.value);
};
그러면 이제 글 작성 기능은 끝났습니다.
이제 작성한 글을 볼 수 있어야 되니까 post.js에서 export 바로 위에 아래 라우트를 추가해 줍니다.
router.get('/:id', (req, res) => {
if (Number.isInteger(Number(req.params.id))) {
Render(res, req, req.params.id);
} else {
res.send('비정상적인 접근입니다.');
}
});
function Render(res, req, postId) {
req.database.query(`SELECT * FROM POST WHERE id = ${postId};`, (err, post) => {
if (err) {
throw err;
}
if (post.length === 0) {
res.send('존재하지 않는 글입니다.');
}
if (!req.session.nickname) {
req.database.query(`UPDATE post SET views = views + 1 WHERE id = ${postId};`);
}
post[0].writtentime = moment(post[0].writtentime).format('YYYY.MM.DD. HH:mm');
post[0].views++;
res.status(200).render('post', {
session: req.session,
post: post[0],
categories: req.categories
});
});
}
이 라우트는 반드시 맨 아래에 있어야 되는데 만약 위에 있게되면 post/write같은 요청이 들어왔을 때 write를 id로 인식하게 됩니다.
이제 post.pug 파일을 아래처럼 만들어 줍니다.
extends layout
block post
script(src="https://cdn.quilljs.com/1.3.6/quill.js")
link(href="https://cdn.quilljs.com/1.3.6/quill.snow.css" rel="stylesheet")
link(href="/stylesheets/quill-snow-readonly.css" rel="stylesheet")
link(rel='stylesheet', href='/stylesheets/post.css')
article
a(href = '/category/' + categories.find(e=> e.name === post.category).url)
h4.category= post.category
h1.BodyTitle= post.title
small.BodyDateTime= post.writtentime + ` | 조회 ${post.views}`
#editor-container= post.body
if(session.nickname)
.deletenedit
form.delete-container(action = `update` method='post')
input.delete-text(type='hidden' name='id' value=post.id)
input(type='submit' value='수정')
form.delete-container(action = `delete` method='post')
input.delete-text(type='hidden' name='id' value=post.id)
input(type='submit' value='삭제')
script(src = '/scripts/quill-post.js')
그리고 scripts폴더 아래에 quill-post를 아래와 같이 만들어줍니다.
let quill = new Quill('#editor-container', {
modules: {
toolbar: []
},
placeholder: '본문',
readOnly: true,
theme: 'snow' // or 'bubble'
});
let v = quill.getContents().ops[0].insert;
quill.setContents(JSON.parse(v));
이제 글을 작성 하면 작성된 글로 리다이렉션 됩니다.
다음 글에서는 수정, 삭제를 다루겠습니다.