post 메소드를 만들어 보겠습니다.
post 메소드와 관련된 컨트롤러는
db에다가 다큐먼트나, 서브 다큐먼트를 추가시킬 때 사용하는 메소드 입니다.
새로운 로케이션을 생성할 때 /locations라는 url path를 사용하면 됩니다.
form에 리뷰를 달게 해야 합니다.
form에 있는 것을 가져와 db에 추가해봅시다.
req.query로 url에 있는 쿼리 스트링을 가져왔었습니다.
req.body로 form에 있는 데이터를 가져올 수 있습니다.
db에 저장되는 형태를 봅시다.
location이 다큐먼트 형태로 저장이 됩니다.
먼저 모델을 생성하고
create()메소드를 써서 2개의 매개변수를 넣습니다.
첫 번째는 스키마와 매칭되는 데이터입니다.
두 번재는 콜백함수 입니다.( 비동기식으로 만들려고 하기 때문입니다.)
현재 명령이 끝나지 않고 바로 다음 명령으로 넘어가는 기법 입니다.
db에서 데이터를 완전히 가져 왔을 때 호출이 되서 다음에 진행되게 끔 만듭시다.
1. form데이터를 가져와서 스키마와 매칭되는 js 객체 생성하는 것
(req.body로 가져옵시다.)
2. create매소드로 성공하면 콜백함수가 실행
다큐먼트를 생성하면 locationsCreate 컨트롤러를 만들어 봅시다.
review에서 rating은 세팅하지 않았습니다.
맨 처음에 리뷰는 0점 이였습니다.
유효성 검사가 없다는 것을 알 수 있습니다.
db에 들어갈 때 유효성을 검사해서 안맞으면 db에 넣으면 안됩니다.
이게 깨지면 무결성이 깨집니다.
mongoose를 이용해서 무결성을 검사하는 방법을 봅시다.
예시로)
required: ture
name이 들어가 있지 않으면 db에 저장되지 않게끔 하는 것입니다.
서브 다큐먼트를 생성하는 방법을 알아봅시다.
location안에 review를 남길 수 있습니다.
이 review를 서브 다큐먼트라고 볼 수 있습니다.
새로운 서브 다큐먼트를 생성하려면 3단계가 필요합니다.
1. 해당되는 부모 다큐먼트를 찾아야 합니다.
2. 그 부모 다큐먼트에다가 서브 다큐먼트를 붙히고
3. 부모 다큐먼트를 저장합니다.
doAddReview라는 매소드를 만들었습니다.
리뷰 추가 과정을 살펴봅시다.
location에 리뷰들이 배열로 여러개 있습니다.
맨 끝에 하나를 추가해야 합니다.
push명령으로 하나를 맨 끝에 넣습니다.
body객체를 통해서 리뷰 객체를 가져옵시다.
reviews.push
reviews배열 끝에 push합니다.
서브 다큐먼트를 저장하면 되는게 아니고
부모 다큐먼트를 저장해야 합니다.
부모 다큐먼트를 저장하는 메소드인 save()가 있습니다.
db와 관련되어있으니 비동기 식으로 합니다.
저장된 locatoin 객체의 reviews배열에 있는 맨 마지막 요소를 가져와야 합니다.
리뷰의 rating을 다는 부분이 있습니다.
한 location에 대한 여러개의 리뷰가 있고요 그 리뷰마다 rating이 달라질 것 입니다.
홈페이지에 대표로 보여주는 rating은 평균의 값이여야 할 것입니다.
updateAverageRating()이라는 메소드로 나타내여 봅시다.
평균 점수를 바꿔봅시다
5단계로 나눠서 살펴봅시다.
1. 부모 다큐먼트 = location 을 찾습니다.
2. 리뷰글이 많이 달려있다면 루프를 돌면서
3. 평균값을 구합니다.
4. location에 들어 있는 rating을 바꿔줍니다.
5. 다큐먼트를 저장합니다.
select로 rating과 review만 가져옵니다.
locationid를 조심합시다 id는 소문자입니다.
업데이트를 하는 put메소드를 봅시다.
특정 location은 업데이트 하는경우와
id를 지정하면됩니다
특정 review를 업데이트 하는 경우 2가지가 있습니다.
특정 location의 reviewid를 적으면 됩니다.
데이터를 개선시키고 싶습니다.
4단계로 나눠서 업데이트 하겠습니다.
1. 관련 다큐먼트를 찾습니다.
2. 조작해봅니다.
3. 해당 다큐먼트를 저장하고
4. json으로 전달합니다
에플리케이션에서 스키마가 모델(인스턴스)로 바뀝니다.
1:1로 mongodb에 있는 다큐먼트하고 매핑이 이루어집니다.
그래서 model로 다큐먼트를 조작합니다.
갱신하는 컨트롤러를 만들어 봅시다.
location의 name을 바꿀 수 있습니다.
오류 트래핑 까지 추가한 내용 입니다.
select('-reviews') 는 뭘까요?
select에서 reviews 필드를 제외하고 가져온다는 것입니다.
자세한 설명입니다.
-는 검색하고 싶지 않다는 의미 입니다.
서브 다큐먼트를 갱신해봅시다.
리뷰 다큐먼트는 중첩되어 있습니다.
5단계로 갱신을 할 수 있습니다.
1. 부모 다큐먼트 찾습니다.
2. 서브 다큐먼트를 찾습니다.( review)
3. 서브 다큐먼트의 변경할 내용 넣습니다.
4. 부모 다큐먼트를 저장하고
5. json을 보내줍시다.
찾고 싶은 서브 다큐먼트는 reviews 입니다.
그러면 평균 rating도 다시 계산해야 합니다.
에러 트래핑까지 한 코드 내용 입니다.
5로 된 등급을 세로운 내용으로 업데이트 할 수 있습니다.
삭제에 대해 알아봅시다.
다큐먼트를 삭제할 수도 있고 서브 다큐먼트를 삭제할 수 있습니다.
id를 주면 삭제해주는 메소드가
findByIdAndRemove() 입니다.
findById와
remove 사이에 무언가를 집어넣으면 유연하게 만ㄴ들 수 있습니다.
서브다큐먼트를 삭제하는 과정을 알아봅시다.
1. 부모 다큐먼트 찾고
2. 관련된 서브 다큐먼트 찾고
3. 서브 다큐먼트 제거하고
4. 부모 다큐먼트 저장합니다.
5. 성공, 실패 여부를 알려줍니다.
서브 다큐먼트를 삭제하는 방법은 쉽습니다.
id()메소드로 review를 찾아서
remove()로 삭제해줍시다.
오류 트래핑까지 관리한 코드 입니다.
리뷰에는 등급이 있었습니다.
그리니 평균 등급도 다시 계산을 해줘야 합니다.
https://github.com/simonholmes/getting-MEAN-2/blob/chapter-09/app_api/controllers/reviews.js
'웹 > school(MEAN)' 카테고리의 다른 글
Consuming a REST API [3]:Using an API from inside Express (0) | 2021.11.02 |
---|---|
Consuming a REST API [1]:Using an API from insideExpress (0) | 2021.10.19 |
Writing a REST API [2]:Exposing the MongoDBdatabase to the application (0) | 2021.10.12 |
Building a data model withMongoDB and Mongoose [1] (0) | 2021.09.29 |
Building a static sitewith Node and Express [2] (0) | 2021.09.28 |