지금까지 미니프로젝트에서 data를 database Schema를 만드는 게 아니라 Map 객체를 이용해서 사용을 했었는데요. 본격적으로 시작하기 앞서서 database를 만들 때 참고할 ERD를 짜보려고 합니다. 테이블은 두 가지로 만들 건데요. 첫 번째로 user 테이블, 두 번째로 channel 테이블을 만들어볼 예정입니다. 1) USER TABLE 필요 데이터 : 회원번호, 회원아이디, 회원비밀번호, 회원이름 이때 회원번호는 고유번호로 PK, 회원아이디도 단 하나의 아이디여야 하기 때문에 UQ, 로 설정을 하려 합니다. 회원번호(PK) 아이디(UQ) 비밀번호 이름 1 testId1 1234 테스터1 2 testId2 9876 테스터2 2) CHANNEL TABLE 필요데이터 : 채널번호, 채널주인..
그동안 user와 channel을 각각의 파일에서 작업을 하고 확인을 진행하였는데요. 이제 router를 이용하여 router 관리를 해보려합니다. 폴더구조 정리 기존에 루트 폴더에 있던 channels.js와 users.js를 routes폴더 안에 넣고, 서버구동에 사용하는 app.js를 생성하였습니다. root ├─ app.js └─ routes ├─ channels.js └─ users.js 이제 router로 관리를 하기 위해서 channels와 users 파일을 모듈로 만드는 작업을 해보려 합니다. 기존 channels와 users 파일 //기존의 app을 router로 변경 const app = express(); → const router = express.Router(); app.get(경..
DB를 이용하여 채널 전체 조회하기 유효성 검사 body("user_id").notEmpty().withMessage("user_id를 입력해주세요") .isInt().withMessage("user_id 데이터가 잘못입력되었습니다.") 채널 전체 조회 이미 유효성 검사를 통해서 user_id 값이 undefined로 넘어오는것이 아니기 때문에 해당 부분을 if(data.length === 0)으로 조건을 넘겼고, 해당 조건이 일치할경우는 user_id값을 갖고있는 채널이 존재하지 않다는 뜻이기 때문에 notFoundChannel함수를 사용하였습니다. const { user_id } = req.body; try { const select_sql = "select * from channels where u..
DB를 이용하여 채널 개별 수정하기 유효성 검사 채널 개별 수정의 경우에는 param을 통해 채널번호를 받고, body값으로는 title과 description을 받지만 description은 필수항목이 아니기 때문에 유효성검사에서는 제외하였습니다. param("id").notEmpty().withMessage("채널번호가 없습니다."), body("title").notEmpty().withMessage("제목을 입력하세요"), 채널 개별 수정 let { id } = req.params; id = parseInt(id); const { title, description } = req.body; const update_sql ="update channels set title = ? , description..
DB를 이용하여 채널 개별 삭제하기 유효성 검사 param("id").notEmpty().withMessage("채널번호 필요") 채널 개별 삭제 let { id } = req.params; id = parseInt(id); const delete_sql = "delete from channels where id = ?"; try { const [data] = await conn.query(delete_sql, id); if (data.affectedRows == 0) { return notFoundChannel(res); } res.status(200).json({ message: `그동안 유튜브를 이용해 주셔서 감사합니다.` }); } catch (err) { return res.status(400)..
DB를 이용하여 채널 개별 조회하기 유효성 검사(express-validator) 이번 유효성 검사는 params로 받아오기때문에 param을 통해서 비어있지 않은 경우를 확인하기로 했습니다. [param("id").notEmpty().withMessage("id 값이 없습니다.")] 채널 개별 조회 조회는 SELECT문을 사용하는데요 id값이 존재 하지 않는 경우에는 undefined를 받기 때문에 if문에 걸려서 notFoundChannel이 호출이 되고 return시켜 아래 코드를 읽지 않게 됩니다. let { id } = req.params; id = parseInt(id); const select_sql = "select * from channels where id = ?"; try { cons..
DB 이용하여 채널 생성하기 유효성 검사(express-validator) if (!email) { return res.status(400).json({ message: "이메일을 입력해주세요" }); } if (!title) { return res.status(400).json({ message: "채널명을 입력해주세요." }); } 이존의 이 코드들을 validator를 이용하여 유효성 검사로 빠지게 되었습니다. 유효성 검사 코드는 아래 코드로 대체하였습니다. [body("email").notEmpty().withMessage("이메일을 입력해주세요") .isEmail().withMessage("이메일 형식이 아닙니다."), body("title").notEmpty().withMessage("채널명을..
앞서 공부한 회원가입, 회원 개별 조회, 회원 개별 탈퇴와는 다르게 id가 존재하는지 password가 일치하는지를 확인을 하는 작업을 로그인 핸들링함수에서 작성을 해주셔야 하는데요. 때문에 조회, 탈퇴, 가입과 다르게 코드가 조금 복잡해져서 맨 마지막으로 작업하게 되었습니다. 로그인 왜 회원 조회를 하는데 get이 아닌 post를 사용하나요? 로그인할때 우리가 받아오는 id와 password 값의 노출을 막기 위해 안전한 body에 넣어서 사용하는데요. 보통 body 값은 사용자가 form을 통해서 전송을 했을 때 전달을 받을 수 있습니다. 즉 form을 통해서 전달을 받으면 post를 사용한다는 것을 알 수 있습니다. app.post("/login", (req, res) => { const { id,..
개별조회와 삭제는 경로가 일치하기 때문에 .route를 이용하여 묶어서 작업하려고 합니다. app .route('경로') .get(핸들러함수) .delete(핸들러함수) 이 코드에서 핸들러 함수를 작성한다고 봐주시면 좋을 것 같습니다. 회원 개별 탈퇴 .route('/users/:num') .delete((req,res)=>{ let { num } = req.params; num = parseInt(num); if (!db.has(num)) { res.status(404).json({ message: "찾는 유저가 없습니다." }); return; } const user = db.get(num); db.delete(num); res.status(200).json({ message: `${user.name..