npm init
{
"name": "review-back",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
--- Enter 키로 넘기기
"author": "본인 이름",
"license": "MIT"
}
npm i express || npm install express --save
npm i -D nodemon ▶노드몬 설치: 변경사항마다 node **.js 치지 않고 자동 변경 해줌
//삭제하고 싶다면 npm rm -rf nodemon
"scripts": {
"dev": "nodemon app.js" ▶변경 적용, 이후 터미널에서 "npm run dev" 로 실행
},
-express js는 import를 쓰는 ES6
문법 대신 common js
문법 사용
const express = require("express");
const app = express(); ▶const 파일명
const port = 3010; ▶port 숫자는 본인이 설정
app.get("/", (req, res) => { ▶req = request 클라이언트 -> 서버
res.send("Hello, Express"); res = response 서버 -> 클라이언트
});
// 서버 시작 명령어 listen(포트번호, 콜백함수=처리 내용)
app.listen(port, () => {
console.log(`Server listening on port: ${port}`);
});
routes 폴더 내에 모듈을 만들어 효율적으로 API 관리
ex) a 모듈을 만들어 app.js와 연결
const express = require("express");
const aRouter = require("./routes/a"); ▶const 모듈명Router
const app = express();
const port = 3010;
app.use("/a", aRouter); ▶ .use() = Middleware 미들웨어
//app.use("/추가할 경로", 모듈명Router);
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();
router.get("/", (req, res) => {
res.send("데이터 조회, 불러오기");
});
router.post("/", (req, res) => {
res.send("데이터 생성");
});
router.put("/", (req, res) => {
res.send("데이터 수정, 업데이트");
});
router.delete("/", (req, res) => {
res.send("데이터 삭제");
});
module.exports = router;
Goals | CRUD | HTTP Method | REST API |
---|---|---|---|
투두 생성 | Create | POST | / |
전체 리스트 | Read | GET | / |
특정 리스트 | /:id | ||
수정 | Update | PUT | /:id |
완료 여부 | /done/:id | ||
삭제 | Delete | DELETE | /:id |
const express = require("express");
const todoRouter = require("./routes/todo");
const app = express();
const port = 3010;
app.use(express.json()); ▶json데이터 불러오기, 반드시 todo 모듈보다 위에 적용
app.use("/todo", todoRouter);
app.get("/", (req, res) => {
res.send("Hello, Express");
});
app.listen(port, () => {
console.log(`Server listening on port: ${port}`);
});
todo 라우팅 해주고 json 파일도 따로 불러오기
1. Todo 전체 및 특정 리스트 조회
const express = require("express");
let todoData = require("../todoData.json"); ▶JSON 데이터 삽입
const router = express.Router();
//전체 Todo 조회
router.get("/", (req, res) => {
res.json(todoData);
});
//특정 Todo 조회
router.get("/:id", (req, res) => {
const { id } = req.params;
if (parseInt(id) >= todoData.length) {
return res.status(400).json({ error: "존재하지 않는 ID입니다." });
}
res.json(todoData[parseInt(id)]);
});
2. Todo 리스트 생성
//Todo 생성
router.post("/", (req, res) => {
const { title, desc } = req.body;
//만약 res가 2개라면 위에 것만 실행됨, 그래서 return을 추가해줘야 아래 push가 일어나지 않음
if (!title || !desc) {
return res.status(400).json({ error: "타이틀과 설명을 입력하셔야 합니다" });
}
todoData.push({ title, desc, isDone: false });
res.json(todoData);
});
3. Todo 리스트 내용 수정
//Todo 수정
//기존 id의 내용을 body에 적은 내용으로 수정해주기
router.put("/:id", (req, res) => {
const { id } = req.params;
const { title, desc } = req.body;
if (parseInt(id) >= todoData.length) {
return res.status(400).json({ error: "존재하지 않는 ID입니다." });
}
if (!title && !desc) {
res
.status(400)
.json({ error: "타이틀이나 설명 중에 하나의 값은 입력해야 합니다." });
}
//title 이나 desc 둘 중 하나라도 수정하고 싶은 경우를 위해 삼항연산자 설정,
//수정할 내용이 있다면 수정한 내용, 없다면 기존 내용
todoData[parseInt(id)] = {
title: title ? title : todoData[parseInt(id)].title,
desc: desc ? desc : todoData[parseInt(id)].desc,
isDone: todoData[parseInt(id)].isdone,
};
res.json(todoData);
});
4. Todo 리스트 체크
// //Todo 체크
router.put("/done/:id", (req, res) => {
const { id } = req.params;
// id값 확인
// console.log(req.params);
// 예외처리: 배열보다 긴 id의 done을 처리한다면 에러
if (parseInt(id) >= todoData.length) {
res.status(400).json({ error: "존재하지 않는 ID입니다." });
}
todoData[parseInt(id)] = {
title: todoData[parseInt(id)].title,
desc: todoData[parseInt(id)].desc,
isDone: !todoData[parseInt(id)].isDone,
};
res.json(todoData);
});
5. Todo 리스트 삭제
//Todo 삭제
router.delete("/:id", (req, res) => {
//제거하려면 filter필요
const { id } = req.params;
// 예외처리: 배열보다 id 길이가 길면 안되게 처리
if (parseInt(id) >= todoData.length) {
res.status(400).json({ error: "존재하지 않는 ID입니다." });
}
//filter로 id와 i가 같지 않으면 return, 같으면 삭제
todoData = todoData.filter((v, i) => {
return parseInt(id) !== i;
});
res.json(todoData);
});
module.exports = router;