Node 강의/숙련

2-4 [게시판 프로젝트] 게시글 생성 API

kagan-draca 2024. 9. 9. 12:35

1. [게시판 프로젝트] 게시글 생성 API

사용자(Users)는 게시글을  여러 개를 만들 수 있다. → 1 : N 관계를 가지고 있습니다.

현재 로그인 한 사용자의 정보가 존재하였을 때만 게시글을 생성할 수 있도록 구현 돼야 합니다.

 

routes/posts.router.js 파일을 생성하고, app.js파일에 라우터를 추가하도록 하겠습니다.

2. 게시글 생성 API

1) posts.router.js 내용 추가하기

import express from "express";
import prisma from "../src/utils/prisma/index.js";
import authMiddleware from "../middlewares/auth.middleware.js";

const PostsRouter = express.Router();

PostsRouter.post("/posts", authMiddleware, async (req, res, next) => {
  const { userId } = req.user;
  const { title, content } = req.body;

  const post = await prisma.Posts.create({
    data: {
      userId: +userId,
      title,
      content,
    },
  });

  return res.status(201).json({ data: post });
});

export default PostsRouter;

 

게시글 생성은 (중요)authMiddleware로 로그인 된 사용자만 사용할 수 있게 만들었습니다.

// req.user의 정보를 user 정보로 제공해준다.
    req.user = user;

또한, (중요)authMiddleware에서 req.user라는 변수를 만들고 안에 user 정보를 저장해줬기 때문에

const { userId } = req.user;

로 userId를 가져올 수 있습니다.

 

그 후 req.params로 userId를 전달 받아 게시글을 생성할 때 userId를 추가해

누가 만들었는지 등록해주었습니다.

 

이렇게, 사용자와 게시글 1 : N 관계가 성립 됐습니다,

 

2) app.js PostsRouter 추가하기

import PostsRouter from "../routes/posts.router.js";

PostsRouter를 import 받고,

app.use("/api", [UsersRouter, PostsRouter]);

 

/api/posts로 경로를 사용할 것이기 때문에,

경로가 "/api"인 Router 뒤에 추가해줍니다.

 

3) Insomnia에서 localhost:3018/api/posts 에 접속해 게시글을 등록하면,

userId가 2인 사용자가 postId 1번이고, title이 "타이틀", content가 "콘텐트"인 게시글이 생성 됐습니다.

 

만약, 로그인 상태가 아닌 상태에서 게시글 생성을 수행하면

토큰이 존재하지 않는다는 문구 Clinet에게 응답으로 전송되고 게시글은 생성되지 않습니다.

3. 게시글 조회 API

1) 게시글 목록 조회 API

// 게시글 전체 조회 API
PostsRouter.get("/posts", async (req, res, next) => {
  const posts = await prisma.Posts.findMany({
    select: {
      postId: true,
      userId: true,
      title: true,
      createdAt: true,
      updatedAt: true,
    },
    orderBy: {
      postId: "desc",
    },
  });
  return res.status(200).json({ data: posts });
});

Insomnia에서 localhost:3018/api/posts 에 접속해 게시글 전체 조회를 하면,

2) 게시글 상세 조회 API

// 게시글 검색 조회 API
PostsRouter.get("/posts/:postId", async (req, res, next) => {
  const { postId } = req.params;

  const post = await prisma.Posts.findFirst({
    where: {
      postId: +postId,
    },
    select: {
      postId: true,
      userId: true,
      title: true,
      content: true,
      createdAt: true,
      updatedAt: true,
    },
  });

  if (!post)
    return res.status(204).json({ message: "게시글이 존재하지 않습니다" });

  return res.status(200).json({ data: post });
});

Insomnia에서 localhost:3018/api/posts/:postId 에 접속해 게시글 검색 조회를 하면,