TIL/Today I Learned
[TIL] 23.08.30 Today I Learned / next.js 개발자 커뮤니티 제작(게시판 리스트)
임성장
2023. 8. 31. 00:32
728x90
요약: 개발자 커뮤니티 제작(게시판 리스트)
일시: 23.08.30
장소: 더휴먼컴퓨터아트아카데미
배운 점:
- useEffect를 활용하여 첫 Mount 시 서버에 요청해 DB에서 게시판 글 데이터를 가져옴.
- 페이지네이션 라이브러리는 이전에 만든 컴포넌트를 재사용함.(react-js-pagination)
- 페이지네이션 구현을 위해 DB에서 데이터를 가져올 때 10씩 가져오고 현재 페이지 * 10 만큼 제외한 게시글을 가져옴
- 페이지네이션의 페이지 수 계산을 위해 countDocuments() 함수를 활용해서 전체 글 갯수를 구함.
const db = (await connectDB).db("~~"); // connectDB()를 호출하여 DB 연결을 얻습니다.
const result = await db
.collection("~~~")
.find({ ~~~~ })
.skip(perPage * (page - 1))
.limit(perPage)
.toArray(); // find 결과를 배열로 변환하여 가져옵니다.
// 성공 시 결과 전달
const dbCnt = await db.collection("~~~").countDocuments({ ~~~ });
return res.status(200).json({ result, dbCnt });
- 서버로부터 받은 메시지를 출력하고 싶어서 submit을 함수로 구현함.
- form 태그의 value들을 변수에 저장해서 그것을 서버에 전송.
- 서버와 통신을 성공해 글을 게시했으면 해당 카테고리로 url 이동함.
const handleSubmit = async (e) => {
e.preventDefault(); // 폼 기본 제출 동작 막기
let data = {};
const title = e.target.title.value;
const content = e.target.content.value;
const board = e.target.board.value;
const view = e.target.view.value;
if (e.target.image && e.target.boardimage) {
const boardimage = e.target.boardimage.value;
const image = e.target.image.value;
data = { title, content, board, view, boardimage, image };
} else {
data = { title, content, board, view };
}
if (!title || !content) {
alert("제목과 내용은 필수 입력 사항입니다.");
return;
}
// fetch를 사용하여 데이터 서버로 전송
const response = await fetch("/api/post/upload", {
method: "POST",
body: JSON.stringify(data),
});
if (response.ok) {
// 성공적으로 서버에 전송됨
// 필요한 처리를 수행
const successMessage = await response.json();
alert(successMessage);
router.push(`/board/${board}`);
} else {
// 서버로부터 오류 응답을 받음
const errorResponse = await response.json();
alert(errorResponse);
// 오류 처리
}
};
부족한 점:
728x90