0. 목차
1. 개요
2. DB
3. 파일 쪼개기
4. CRUD 기능개발
5. 후기
1. 개요
2022.02.11 - [경일/nodejs] - [node.js] express-session, mySQL 로그인 기능 구현
위 포스팅에서 만든거에다가,
회원만 이용가능한 게시판을 만들거다.ㅎ
2. DB
user table
board table
이런 식으로 디비를 만들어서 임시데이터를 만들었다.
3. 파일쪼개기
쪼갬 ^^
4. CRUD 기능개발
4-1. board list
exports.listGetMid = (req, res) => {
const query = `SELECT board._id, board.subject, user.name AS username
FROM board
JOIN user
ON board.author = user._id`;
db.query(query, (error, result) => {
if (error) return console.log(error);
if (result) res.render('board/list.html', { boardList: result });
});
};
쿼리문이 길어져서 선언을 해준뒤에 따로 뺐다.
결과물을 boardList 변수에 담아 html로 전달해주고,
html에선 for문으로 돌려서 db에 있는 내용을 랜더링 해준다
4-2. board view
exports.viewGetMid = (req, res) => {
const index = Number(req.query.index);
const query = `SELECT board.subject, user.name AS username, board.content
FROM board
JOIN user
ON board.author = user._id
WHERE board._id = ${index}
`;
db.query(query, (error, result) => {
if (error) return console.log(error);
if (result) {
res.render('board/view.html', { posting: result[0] });
}
});
};
음 뭐 딱히 설명할게 없다.
굳이굳이 하나 하자면,
내가 board 스키마를 짤때,
_id 값을 INT 로 해놔서,
req.query.index 는 문자열이라 number 로바꿔 주었다.
4-2. board write
exports.writeGetMid = (req, res) => {
const { name } = req.session.user;
res.render('board/write.html', { username: name });
};
exports.writePostMid = (req, res) => {
const { _id } = req.session.user;
const { subject, content } = req.body;
if (subject === '' || content === '') {
res.send(alertMove('/board/write', '공백은 입력이 불가능 합니다'));
} else {
const query = `INSERT board (subject, content, author)
VALUES ("${subject}","${content}","${_id}")`;
db.query(query, (error, result) => {
if (error) return console.log(error);
if (result) res.redirect(`/board/view?index=${result.insertId}`);
});
}
};
get 요청이 왔을때는 로그인된 아이디를 html 로 전송해주었다.
이렇게 작성자에 수정할수 없게끔 만들어주고 싶었음 ㅎ
POST 요청은 우선 제목과 내용에 모두 아무런 내용도 입력되지 않으면, 디비에 등록이 안되게끔 처리했다.
그리고 글쓰기 버튼을 누르면 디비에 내용이 등록되고, 내가쓴 글의 뷰 페이지로 이동을 하게끔 해야했는데,
uri query 에 넣어줄 값을 고민을 했었다.
근데 console.log 로 result 찍어보니까,
insertId 란 값이있었다.
그게 해당 게시물의 추가된 _id 값이더라 그래서 그걸로 넣어줬다.
4-3. board edit
exports.editGetMid = (req, res) => {
const { _id } = req.session.user;
const index = Number(req.query.index);
const query = `SELECT board._id, board.subject, user.name AS username, board.content
FROM board
JOIN user
ON board.author = user._id
WHERE board._id = ${index}
`;
db.query(query, (error, result) => {
if (error) return console.log(error);
if (result) {
if (result[0]._id === _id) {
res.render('board/edit.html', { posting: result[0] });
} else {
res.send(
alertMove(
`/board/view?index=${result[0]._id}`,
'본인이 작성한 글만 수정할 수 있습니다.'
)
);
}
}
});
};
exports.editPostMid = (req, res) => {
let { _id } = req.body;
_id = Number(_id);
const { subject, content } = req.body;
const query = `UPDATE board
SET subject="${subject}",
content="${content}"
WHERE _id=${_id}`;
db.query(query, (error, result) => {
if (error) return console.log(error);
if (result) {
res.send(alertMove(`/board/view?index=${_id}`, '글이 수정 되었습니다.'));
}
});
};
post 부분은 딱히 특별한게 없지만
get 부분은 조금 신경을 썼다.
현재 로그인이 되어있는 사용자와,
글을 작성한 사용자가 일치하지않는다면, 글수정 버튼을 눌렀을때,
view 페이지로 돌아가고, 본인이 작성한 글만 수정할 수 있다는 경고를 띄워준다.
4-4. board delete
let { index } = req.query;
index = Number(index);
const query = `SELECT _id ,author FROM board WHERE _id = ${index}`;
db.query(query, (error, result) => {
if (error) return console.log(error);
if (result) {
const { _id } = req.session.user;
if (result[0].author !== _id) {
res.send(
alertMove(
`/board/view?index=${result[0]._id}`,
'본인이 작성한 글만 삭제할 수 있습니다.'
)
);
} else {
const query = `DELETE FROM board WHERE _id = ${index}`;
db.query(query, (error, result) => {
if (error) return console.log(error);
res.send(alertMove('/board/list', '글이 삭제 되었습니다.'));
});
}
}
});
음 뭔가 딜리트가 제일 쉬웠는데,
이번엔 제일 어려운것처럼 느껴졌다.
작성된 글의 작성자와, 로그인된 사용자와 일치하는지 확인을 먼저 하고,
일치하면 지우는 건데,
쿼리문을 두번날려야 해서 좀 어렵게 느껴 졌다.
4-5. 로그인 게시판 접속 막기.
이걸 먼저 해버리면 기능개발할 때 좀 걸거쳐서
맨마지막에 하게됐다.
이렇게 해줌 ㅎ
5. 후기
재밋다.. 진짜로..
로그인이랑 게시판이랑 붙이니까 이게 진짜 재밌음
글을 쓸때 자동으로 로그인된 사용자의 name을 입력되게 한다거나,
직접쓴 글만 수정 삭제 할 수있게 한다거나 하는 부분은 진짜 꿀잼이었다.
코딩할맛 난다..!
'경일 > nodejs' 카테고리의 다른 글
[node.js] fetch(async, await)로 로그인기능 만들어보기 (0) | 2022.02.15 |
---|---|
[node.js] 프론트 없이 POST request 확인하기(feat. 포스트맨) (0) | 2022.02.15 |
[node.js] express-session, mySQL 로그인 기능 구현 (0) | 2022.02.11 |
[nodejs] express-session 이용해서 로그인 기능 구현 (0) | 2022.02.09 |
[nodejs] express-session 사용하기 (0) | 2022.02.09 |
댓글