이전 시간에 prisma와 planetscale을 통해 구현한 DB에 연결할 BE를 만들어보자.
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}`);
});
const express = require("express");
const router = express.Router();
module.exports = router;
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;
client
로 변수 선언비동기 처리
요청
응답
여기서 중복 문제가 하나 발생한다. account가 중복되면 생성되지 않도록 처리 해줘야 한다.
const existAccount = await prisma.user.findUnique({
where: {
account,
},
});
if (existAccount) {
return res
.status(400)
.json({ ok: false, error: "Account is already existed" });
}
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);
}
});
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);
}
});
user
모듈의 id가 꼭 필요하므로 존재하는지 조회 처리를 해준다.todo
모듈의 userId 는 user
모듈의 id와 같으므로 userID
를 user.id
로 정의한다.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);
}
});
a. 업데이트하려는 Todo가 존재하는지? id로 확인
b. 업데이트하려는 Todo의 userId가 자신의 것인지?
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);
}
});