-
TIL내일배움캠프/TIL 2022. 12. 23. 23:07
TIL
목표
- MySQL 특정 컬럼 삭제하기
문제
- 쿼리문으로 삭제는 간단하지만, sequelize를 처음 맛보는 중이라 이놈들을 어떻게 손봐줘야 할지 모름.
시도
그냥 migrations/create-user.js 와 models/user.js에서 email컬럼 관련 내용들을 삭제해 보았다.
해결
// migrations/...create-user.js email: { allowNull: false, unique:true, type: Sequelize.STRING }, 삭제. // models/user.js email: DataTypes.STRING, 삭제.
알게된것
sequelize에서 저렇게 삭제하면 아직은 오류가 없다.
그래서 오류를 만나기전까진 그렇게 삭제하면 되는걸로 알고 있을거고,
오류를 만나길 기대한다.
목표
- sequelize를 이용하여 게시글 테이블 만들기
문제
- 모델을 어떻게 만들지?
- 모델을 잘못만들었다. 어떻게 되돌리기? 삭제? 를 하나
시도
공식문서를 봐보니 무슨말인지 몰라도 대충 느낌상으로 이해해보려한다..
npx sequelize model:generate --name Boards --attributes title:string,content:string,userId:int
여기선 이렇게 모델을 만들고, migrations에서 foreign key 설정을 해주지 않을까 싶어 일단 만들어보고 시도해본다.
ERROR: Attribute 'userId:int' cannot be parsed: Unknown type 'int'
int가 아니라 integer인가? 해보자. 맞네. integer가 맞다. 맛있다.
되돌리고싶다 강렬히. boards가 아니라 posts로 만들어야 했다.
그래 그냥 수정하자. 해보자.해결
boards로 보이는, 관련있어 보이는 것들을 골라서 수정해보았다.
migrations -> Posts
model -> Post
물론 파일명도 변경했다.알게된것
model과 migrations 에서 수정을 하면 반영이 잘 되는듯 하다!
목표
- foreign key를 어떻게 설정하나?
문제
- 공식문서의 예를 봐도 모르는점이 존재함
시도
최대한 매치업시켜보고 구글링을 해봄
해결
userId: { allowNull: false, references: { model: { tableName: 'Users', // 'schema': 'schema' }, key: 'userId' }, onDelete: 'cascade', onUpdate: 'cascade', type: Sequelize.INTEGER }, // 공식문서에서는 6번행에 스키마도 적혀있었지만, // 구글링에서 본 결과 스키마가 딱히 없어도 되는 듯 하여 // 모르고 쓸바에야 조금이라도 이해가 되는 쪽만 적었다. // 또한 onDelete, onUpdate도 cascade로 적어주었다. // npx sequelize db:migrate 를 해보니 디비에 테이블이 잘 만들어졌고, // onDelete, onUpdate부분은 적용이 됐는지 잘 모르겠다. // 이후에 API를 만들며 확인해봐야겠다.
알게된것
sequelize를 활용해 외래키를 만드는 방법을 알게 되었다.
ondelete, onupdate도 여기서 이렇게 쓸 수 있구나.
목표
- 게시글 작성 API 작성
문제
- 요구사항 4개의 에러처리를 어떻게 해야할까?(body, title, content, other)
- 게시글 작성을 자꾸 실패함
시도
- 데이터형식을 완전히 잘못 준 경우
- 제목에 데이터를 입력하지 않은 경우
- 내용에 데이터를 입력하지 않은 경우
- 그 외 게시글 작성을 실패했을 경우
위 4개의 경우로 잡고 예외처리를 해보았다.
요청에서 받는 데이터가 title, content여서 디비에 title, content만 넣어줬다.
외래키인 유저아이디도 같이 넣어줘야 했다. 그래서 미들웨어에서 전달받은 유저아이디로 값을 넣어줬다.해결
// 제목이 비어있을 경우 if (title == undefined) { return res.status(412).json({ errorMessage: "게시글 제목의 형식이 일치하지 않습니다." }); } // 내용이 비어있을 경우 if (content == undefined) { return res.status(412).json({ errorMessage: "게시글 내용의 형식이 일치하지 않습니다." }); } // body의 형식이 정상적이지 않을 경우 catch { return res.status(412).json({ errorMessage: "데이터 형식이 올바르지 않습니다." }); } // 게시글 작성에 실패했을 경우 catch(err) { return res.status(400).json({ errorMessage: "게시글 작성에 실패하였습니다." }); }
알게된것
userId를 넣기위해 jsonwebtoken을 불러와서 verify를 사용하려는 순간,
이미 검증미들웨어를 만들어뒀는데 검증을 두번하면 뭔가 불편한데? 생각해보니
검증미들웨어에서 내가 뭘 넘겨줬던 것 같은데 하고 함수를 살펴보니
유저데이터를 넘겨줬었다.
그래서 그 데이터에서 유저아이디를 빼와서 바로 디비에 넣어줬다.또한 try-catch 안에 try-catch를 또 사용할 수 있다는 걸 알게 되었다.
중복 if문 같아서 마음이 불편하긴 했는데, 구글링 내용 중
exception 종류에 따라 적절한 위치에 catch하기 위함이라는 내용이 있었다.
그 설명을 들으니 마음이 조금은 편안해졌다.'내일배움캠프 > TIL' 카테고리의 다른 글
개인과제 마무리. (1) 2022.12.26 sequelize를 이용한 게시글 조회, 수정, 삭제 (0) 2022.12.25 javascript sort([option]), 포스트맨 쿠키삭제방법 (2) 2022.12.23 자바스크립트 복습, 알고리즘, 노드 (0) 2022.12.20 mongoose.Types.ObjectId 미들웨어로 등록시키기 (0) 2022.12.16