TIL
Nodejs 강의 숙련 게시판 프로젝트(8) 게시글 생성,조회 / 댓글 생성,조회
황민도
2024. 5. 28. 14:32
내일배움캠프 스파르타 코딩클럽
저번에 에러 핸들링 미들웨어까지 구현을 해보았고
이번에는 게시글을 다뤄볼까한다.
[ 게시글 생성 API ]
< posts.router.js >
import express from 'express';
import authMiddleware from '../middlewares/auth.middleware.js'
import { prisma } from '../utils/prisma/index.js'
const router = express.Router();
// 게시글 생성 API
router.post('/posts', authMiddleware, async (req, res, next) => {
// 1. 게시글을 작성하려는 클라이언트가 로그인된 사용자인지 검증합니다. router.post('/posts', authMiddleware,
// authMiddleware 에서 할당한 해당 user db 정보를 바탕으로 아래와 같이 변수로 지정하고 객체 구조분해 할당으로 userId만 가지고 온다.
const { userId } = req.user;
// 2. 게시글 생성을 위한 `title`, `content`를 **body**로 전달받습니다.
const { title, content } = req.body
// 3. **Posts** 테이블에 게시글을 생성합니다.
const post = await prisma.posts.create({
data: {
UserId: userId,
title,
content
}
})
return res.status(201).json({ data: post });
})
export default router
[ 게시글 조회 API ]
< posts.router.js >
// 게시글 목록 조회 API
router.get('/posts', async (req, res, next) => {
const posts = await prisma.posts.findMany({
select: {
postId: true,
title: true,
createdAt: true,
updatedAt: true
},
// 정렬
orderBy: {
// 만든 시간 내림차순 정렬 (오름차순은 'asc')
createdAt: 'desc'
}
});
return res.status(200).json({ data: posts });
})
[ 게시글 상세 조회 API ]
< posts.router.js >
// 게시글 상세 조회 API
router.get('/posts/:postId', async (req, res, next) => {
const { postId } = req.params;
const post = await prisma.posts.findFirst({
where: { postId: +postId },
//params로 받는 부분은 문자열이기 때문에 db에 있는 Int로 설정된 postId와 type 다르기때문에 +연산자 사용, 숫자로 변경
select: {
postId: true,
title: true,
content: true,
createdAt: true,
updatedAt: true
}
})
return res.status(200).json({ data: post });
})
[ 댓글 생성 API ]
< comments.router.js >
import express from 'express';
import authMiddleware from '../middlewares/auth.middleware.js';
import { prisma } from '../utils/prisma/index.js';
const router = express.Router()
router.post('/posts/:postId/comments', authMiddleware, async (req, res, next) => {
// 1. 댓글을 작성하려는 클라이언트가 로그인된 사용자인지 검증합니다.
const { userId } = req.user
// 2. 게시물을 특정하기 위한 `postId`를 **Path Parameters**로 전달받습니다.
const { postId } = req.params;
// 3. 댓글 생성을 위한 `content`를 **body**로 전달받습니다.
const { content } = req.body;
const post = await prisma.posts.findFirst({
where: { postId: +postId }
})
if(!post) {
return res.status(404).json({ errorMessage: '게시글이 존재하지 않습니다.'})
}
// 4. **Comments** 테이블에 댓글을 생성합니다.
const comment = await prisma.comments.create({
data: {
content,
PostId: +postId,
UserId: userId
}
})
return res.status(201).json({ data: comment });
});
export default router
[ 댓글 조회 API ]
< comments.router.js >
// 댓글 조회 API
router.get('/posts/:postId/comments', async (req, res, next) => {
const { postId } = req.params;
// 게시글이 존재하는지 여부를 확인하기 위해 작성
const post = await prisma.posts.findFirst({
where: { postId: +postId }
});
if(!post) {
return res.status(404).json({ errorMessage: '게시글이 존재하지 않습니다.'});
}
// 댓글 조회 데이터
const comments = await prisma.comments.findMany({
where: { PostId: +postId },
select: {
content: true,
PostId: true,
commentId: true,
createdAt: true,
updatedAt: true
},
orderBy: { createdAt : 'desc' }
})
return res.status(200).json({ data: comments });
})
이렇게 해서 게시판 프로젝트의 기본기능 구현들을 모두 알아보았고
다음에 시간이 난다면 그 추가적으로 트랜잭션에 대해 다뤄볼려 한다.