이 글은 충청 ICT이노베이션스퀘어 Web Programming & AI 온라인 교육중 CRUD 게시판 만들기 실습을 하고 정리한 글입니다.
const mongoose = require('mongoose');
const shortId = require('../types/short-id');
const PostSchema = new mongoose.Schema({
shortId,
title : String,
content: String,
author : String,
}, {
timestamps : true
});
module.exports = PostSchema;
제일 먼저 user가 게시판에 등록할 Data를 정의해준다. ObjectID는 URL에 사용하기에 적합하지 않기에 ShortID를 사용하고 제목, 내용, 작성자를 데이터로 넣어준다. 또한 timestamps 옵션을 통해 작성시간, 수정시간을 자동으로 기록하게 해준다.
const { nanoid } = require('nanoid');
const shortId = {
type: String,
default: () => {
return nanoid();
},
require: true,
index: true,
}
module.exports = shortId;
router.get('/', async(req, res, next) => {
if (req.query.write) {
res.render('posts/edit');
return;
}
...
})
GET 요청 들어올시 쿼리에 write파라미터가 있는지 확인 후 있으면 게시글 작성페이지인 /posts/edit 페이지를 전송
router.post('/', async(req, res, next) => {
const {title, content} = req.body;
try {
await Post.create({
title,
content,
});
res.redirect('/');
} catch(err) {
next(err);
}
});
POST 요청이 들어올시 body 부분의 title, content 값을 가져와서 Document 생성, 그 후에 / 페이지로 리다이렉트
router.get('/', async(req, res, next) => {
if (req.query.write) {
res.render('posts/edit');
return;
}
// 게시글 목록
const posts = await Post.find({});
res.render('posts/list', { posts });
})
게시글 목록은 게시글 생성을 처리하는 부분에서 처리한다. write 파라미터가 없이 바로 /posts 로 접근했을시에 모든 데이터를 찾아 /list 페이지에서 보여주도록 한다.
router.get('/:shortId', async (req, res, next) => {
const { shortId } = req.params;
const post = await Post.findOne({ shortId });
if (!post) {
next(new Error('Post NotFound'));
return;
}
...
res.render('posts/view', { post });
});
GET 메소드로 /posts/{shortId} 페이지에 접근 했을 시 해당 shortId에 해당되는 값들을 가져와 view 페이지에서 보여주도록한다.
router.get('/:shortId', async (req, res, next) => {
const { shortId } = req.params;
const post = await Post.findOne({ shortId });
if (!post) {
next(new Error('Post NotFound'));
return;
}
# 수정페이지
if (req.query.edit) {
res.render('posts/edit', { post });
return;
}
res.render('posts/view', { post });
});
쿼리에 edit 파라미터가 존재한다면 posts/edit 페이지에서 글을 다시 작성 가능하도록 처리
router.post('/:shortId', async(req, res, next) => {
const {shortId} = req.params;
const {title, content} = req.body;
const post = await Post.findOneAndUpdate({shortId}, {title, content,});
if (!post){
next(new Error('Post NotFound'));
return;
}
res.redirect(`/posts/${shortId}`);
});
게시글 데이터를 수정 작성 한 뒤 posts/{shortId}에 POST 요청시 해당 shortId에 해당하는 Document의 데이터를 수정한뒤 상세페이지로 redirect
router.delete('/:shortId', async(req, res, next) => {
const {shortId} = req.params;
try {
await Post.deleteOne({ shortId });
res.send('OK');
} catch (err){
next(err);
}
});
delete 요청이 오면 해당 document를 삭제 후에 OK를 보냄
자세한 코드는 아래에 링크에 있습니다. https://github.com/dlxla4820/crud_board1/tree/master/express-start2