백엔드 DB와 연결

frookie·2023년 4월 13일
0

ExpressJS

목록 보기
1/4

https://velog.io/@frookie/Prisma-PlanetScale

이전 시간에 prisma와 planetscale을 통해 구현한 DB에 연결할 BE를 만들어보자.

기본 세팅

  • app.js
const express = require("express");
const userRouter = require("./routes/user");
const cors = require("cors");

const app = express();

const port = 3010;

app.use(cors());
app.use(express.json());
app.use("/user", userRouter);

app.get("/", (req, res) => {
  res.send("Hello, Express");
});

app.listen(port, () => {
  console.log(`Server listening on port: ${port}`);
});
  • user.js
const express = require("express");

const router = express.Router();

module.exports = router;

DB와 연결

User 모듈

1. 유저 생성

  • user.js
const express = require("express");
const { PrismaClient } = require("@prisma/client");

const router = express.Router();

const client = new PrismaClient();

// 유저생성
router.post("/", async (req, res) => {
  try {
    const { account } = req.body;	▶ 라우터 경로에 :~가 없으면 req.body로 객체에 접근

    const user = await client.user.create({
      data: {
        account,
      },
    });

    // 요청이 잘왔는지 판단하는 ok, 중복처리 필요
    res.json({ ok: true, user });
  } catch (error) {
    console.error(error);
  }
});

module.exports = router;
  1. Prisma명령어를 사용해서 DB와 통신하기 위해 PrismaClient 삽입, 이를 client로 변수 선언
  2. Backend와 DB가 통신하기 때문에 비동기 처리
  3. account를 생성하기 위해 DB에서 account 요청
  4. data에 account를 넣어 응답

여기서 중복 문제가 하나 발생한다. account가 중복되면 생성되지 않도록 처리 해줘야 한다.

const existAccount = await prisma.user.findUnique({
      where: {
        account,
      },
    });

    if (existAccount) {
      return res
        .status(400)
        .json({ ok: false, error: "Account is already existed" });
    }
  1. account가 존재하는지 조회를 한다.
  2. 만약 존재한다면 에러 처리를 해준다.

2. 유저 조회

router.get("/:account", async (req, res) => {
  try {
    const { account } = req.params;		▶ 라우터 경로에 :account 가 있어서 req.params
...
    오류 처리는 위와 동일, 다만 이번에는 조회하려는 account 값이 있어야 하므로 !로 처리
...
    const getAccount = await prisma.user.findUnique({
      where: {
        account,
      },
    });

    res.json({ ok: true, user: getAccount });
  } catch (error) {
    console.error(error);
  }
});
  1. account의 존재 여부를 조회 후 오류 처리를 해준다.
  2. DB에서 account를 찾아서 조회해준다.

Todo 모듈

1. Todo 생성

router.post("/", async (req, res) => {
  try {
    const { todo, userId } = req.body;

    const user = await prisma.user.findUnique({
      where: {
        id: parseInt(userId),
      },
    });
    if (!user) {
      return res.status(400).json({ ok: false, error: "User is not exitsed" });
    }

    const newTodo = await prisma.todo.create({
      data: {
        todo,
        isDone: false,
        userId: user.id,
        //위에서 user를 한번 조회해서 user.id 사용 가능
      },
    });

    res.json({ ok: true, todo: newTodo });
  } catch (error) {
    console.error(error);
  }
});
  1. Todo를 생성하기 위해 todo와 useId를 필수로 입력해야 하므로 구조분해로 받아온다.
  2. Todo를 생성하려면 user모듈의 id가 꼭 필요하므로 존재하는지 조회 처리를 해준다.
  3. todo모듈의 userId 는 user모듈의 id와 같으므로 userIDuser.id로 정의한다.
  4. 여기서 todo와 userId는 필수로 입력해야하므로 에러처리를 해준다.
  5. todo와 userId를 입력하지 않았을 때의 오류를 관리해준다.

2. Todo 조회

router.put("/:id/done", async (req, res) => {
  try {
    const { id } = req.params;
    const { userId } = req.body;

    const existTodo = await prisma.todo.findUnique({
      where: {
        id: parseInt(id),
      },
    });

    //todo 존재 여부 확인
    if (!existTodo) {
      return res.status(400).json({
        ok: false,
        error: "Not existed Todo",
      });
    }
    //본인 소유의 todo인지 확인
    if (existTodo.userId !== parseInt(userId)) {
      return res
        .status(400)
        .json({ ok: false, error: "You can only update your own Todo." });
    }

    const updateTodo = await prisma.todo.update({
      where: {
        id: parseInt(id),
      },
      data: {
        isDone: !existTodo.isDone,
      },
    });

    res.json({ ok: true, todo: updateTodo });
  } catch (error) {
    console.error(error);
  }
});
  1. 완료 처리를 하기 위한 조건은 2가지가 필요하다.

a. 업데이트하려는 Todo가 존재하는지? id로 확인
b. 업데이트하려는 Todo의 userId가 자신의 것인지?

  1. a의 조건을 만족하는 Todo의 userId와 Todo모듈의 Todo의 userId가 일치하지 않을 때 에러 처리한다.
  2. 두 조건을 만족하는 id의 내용 삭제 처리해준다.

4. Todo 삭제

router.delete("/:id", async (req, res) => {
  try {
    ...
    const deleteTodo = await prisma.todo.delete({
      where: {
        id: parseInt(id),
      },
    });

    res.json({ ok: true, todo: deleteTodo });
  } catch (error) {
    console.error(error);
  }
});
  1. 완료와 동일한 조건으로 진행한다.
profile
비전공자의 코딩, 블록체인 공부 일지

0개의 댓글