Server, Router
Server : Request를 받는다
Router : Request의 URL에 따라 루트를 정해준다. 어디로 갈지 길을 정해주는, 경로를 가이드 해주는
express 장점? 🔥라우터 정리
Node.js 에서의 라우팅
요청 Request이 날아왔을때, 원하는 경로에 따라 적절한 방향으로 경로를 안내
URL, method 데이터에 따라서 호출해주는 "콜백함수"를 라우팅해준다.
user.js, channel.js를 합치는 새파일 app.js
routes 폴더에 user, channel 파일을 넣는다
모듈화 할 파일에 (user, channel.js)
- express.Router() 호출해서 가져온다. > app = express() 대신 모두 router 변수로 변경한다.
- 모듈화로 내보낸다.
//express 모듈 세팅
const express = require("express");
const router = express.Router();
router.use(express.json());
///.....
router.post("/login", (req, res) => {
///.....
module.exports = router;
app.js에서 user.js, channel.js 를 사용하기 위한 설정
-channels.js의 공통된 url 은 app.js로 빼내기
//express 모듈 세팅
const express = require("express");
const app = express();
app.listen(7777);
//user모듈 미들웨어 생성
const userRouter = require("./routes/users");
const channelRouter = require("./routes/channels");
//모듈 사용
app.use("/", userRouter);
app.use("/channels", channelRouter); //공통된 url 빼내기
회원user, 채널 channel 연동
'회원 하나당, 채널을 여러개 가질 수 있다.' 는 정보를 주의해야 한다.
회원 테이블
user_id | password | name |
testId1 | 1234 | tester1 |
testId2 | 5678 | tester2 |
채널 테이블
id | channel_title | user_id | sub_num | video_num |
1 | 닷다라다나닷 | testId1 | ||
2 | 닿 | testId1 | ||
3 | datdaradanadat | testId2 |
채널이 회원에 대한 정보를 접근한다!
채널생성, 채널 전체조회 에 대해 회원과 연관된 API를 수정해야 한다!
채널 API 설계
- 채널 생성 : POST /channels
- req : body (channelTitle, userId) > userId는 body X header 숨겨서 토큰으로 받을것
- res 201 : `${channelTitle}님 채널을 응원합니다.` >
다른 페이지?
- 회원의 채널 전체 "조회" : GET /channels
- req : body (userId)
- res 200 : 채널 전체 데이터 list, json array
channels.js 수정
req.body에 userId 값을 추가
회원의 채널 전체 조회
예외처리
- userId가 body에 없으면 > 채널관리페이지는 마이페이지로부터 들어가기 때문에 > 로그인 토큰 만료일경우? 로그인 하세요!라고 알림
- userId가 가진 채널이 없으면
if 문 줄이기? 논리연산자, includes() 메서드 배열, 비구조화(삼항연산자), try catch 문
//express 모듈 세팅
const express = require("express");
const router = express.Router();
router.use(express.json());
let db = new Map();
var id = 1;
router
.route("/")
//채널 전체 조회
.get((req, res) => {
var { userId } = req.body;
//json arr
let channels = [];
if (db.size && userId) {
db.forEach((val, key) => {
if (val.userId === userId) channels.push(val);
});
channels.length ? res.status(200).json(channels) : notFoundChannel();
} else {
notFoundChannel();
}
})
//채널 개별 생성
.post((req, res) => {
if (req.body.channelTitle) {
let channel = req.body;
db.set(id++, channel);
res.status(201).json({
message: `${db.get(id - 1).channelTitle} 채널을 응원합니다!`,
});
} else {
res.status(404).json({
message: "요청 값을 제대로 보내주세요.",
});
}
});
function notFoundChannel() {
res.status(404).json({
message: "채널 정보를 찾을 수 없습니다.",
});
}
module.exports = router;
회원 API 인덱스 id 안씀
- 회원 개별 정보 조회 : GET /users
- req : body (userId)
- res : userid, name
- 회원 개별 탈퇴 : DELETE /users
- req : body (userid)
- res :`${name}님 다음에 또 뵙겠습니다.` → 메인 페이지
router
.route("/users")
.get((req, res) => {
let { userId } = req.body;
const user = db.get(userId);
if (user) {
res.status(200).json({
userId: user.userId,
name: user.name,
});
} else res.status(404).json({ message: "회원 정보가 없습니다" });
})
.delete((req, res) => {
let { userId } = req.body;
const user = db.get(userId);
if (user) {
db.delete(userId);
res.status(200).json({
message: `${user.name}님 다음에 또 뵙겠습니다.`,
});
} else res.status(404).json({ message: "회원 정보가 없습니다" });
});
☑️ 배운 점
설계를 한번에 할 수 없다. 변경에 쫄지마라.
예외처리는 was에서도 할 수 있지만 db에서도 할 수 있다.
라우터 처리