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 });
})

댓글 조회가 잘 되는것을 볼 수 있다.

 

이렇게 해서 게시판 프로젝트의 기본기능 구현들을 모두 알아보았고

다음에 시간이 난다면 그 추가적으로 트랜잭션에 대해 다뤄볼려 한다.