초보 개발자

Schema type, 데이터 생성 및 조회 async await 본문

RECAP - WETUBE

Schema type, 데이터 생성 및 조회 async await

taehyeki 2021. 9. 23. 19:38

upload페이지를 만들고 getUpload와 postUpload 핸들러 두개를 만들어서

데이터를 mongodb에 전송하고 가져오는 것을 배워 보려고 한다.

 

server.js파일에 미들웨어 하나를 만들어주자 이것은 post로 데이터를 서버에 전송할 때 

req.body로 받아와 사용할 수 있도록 해주는 코드이다. ( 이것을 작성해주지 않으면 아무것도 전송 X )

extended옵션을 주면 body에 있는 정보들을 보기 좋게 형식을 갖춰주는 일을 해준다.
이 미들웨어를  꼭 route이전에 사용해야한다.
다시 말해 express application이 form의 value를 이해할 수 있도록 하고 우리가 쓸 수 있는 자바스크립트 형식으로 바꿔준다.

 

다시 handler.js로 돌아와서 getUpload와 postUpload를 구분해주겠다.

먼저 Video모델을 사용하기위해 import를 해오고

getUpload는 단순히 화면만 보여주면 되니까 upload pug를 보내주기만 하면 될거같다.

기본적으로 Schema를 수정해보았다. 우리가 default로 해둔 것은 값을 넣지 않았을 때 기본으로 지정해 주는 것이다.

createAt, mate 등을 손 쉽게 default로 지정해두어 데이터를 만들 때마다 일일이 값을 적지 않아주어도 된다.

postUpload에서는 upload.pug에서 정의한 form 안에

각 name으로 지정해놓은 값들을 통해 req.body.title , ...으로 받아올 수 있다.

그렇게 받아온 값들을 Video 모델을 활용하여 

Video.create({})

여기 안에 넣어 주면 생성이 완료 되는 것이다.!!

 

여기서 Video.create 앞에 await가 붙은 것을 확인할 수 있는데

이 것은 잠시 후에 설명하겠다. try catch문으로 오류가 발생하면 실행 될 문장과 성공시 실행될 문장을 구분해 준다.

그리고 "/"으로 redirect해주어 home이 실행되도록 해준다.

 

Video.find()의 경우 database가 종료되거나 바쁘거나 database의 전송이 느려질 수 있다.
왜냐하면 database는 javascipt밖에 존재하기 떄문 << 비동기로 실행
Video.find({}) 이 것은 모든 형태의 비디오를 찾아 준다. {} << search terms이라고 하는데 이게 비어있으면 모든 형식을 찾는다는 것을 의미한다.


Video.find({}, callback)  search terms 뒤에 callback자리이므로 와서 결과를 찾은 뒤 실행할 함수를 적어주면 된다.
callback에는 err와 docs를 수신한다


1. mongoose는 Video.find({}) 이부분에서 database를 불러 올거다.
2. database가 반응하면 mongoose는 이 function을 실행시킨다.
3. mongoose는 err와 video의 값(docs)을 불러온다.

 

여기서 문제가 있다.

 

여기서 callback함수를 쓸 때 res.render를 리턴하고 콜백을 불러온다.
그래서 우리가 data를 가져오기 전에 이미 보내버리기 때문에 의미가 없다 따라서
res.render를 콜백안으로 가져오면 database를 가져온 뒤에 res.render를 실행하기 때문에 데이터를 다 가지고 올 수 있다.

하지만 await을 사용하여 훨씬 간단하게 작성해줄 수 있다.

 

await은 async함수안에서만 사용이 가능하기 때문에 함수 앞에 async를 붙여야 하고 await을 앞에 붙이면 비동기적인 코드를 동기적으로 바꿔줄 수 있다. 

따라서 Video.find가 끝나면 videos에 데이터들이 들어가고 res.render를 통해 pug에 videos를 전달해 주게 되는 것이다.

 

postUpload에서 Video.create로 한번에 생성 저장을 하였는데 따로 분리할 수 있다.


const video = new Video(model/Video.js)({

~~~

~~~
})
await video.save()

이렇게 해주면 된다.

데이터가 생성되면 자동으로 video안에  _id라는 고유값을 mongoose가 자동으로 만들어 준다. 

video._id >> object

video.id   >> string 

'RECAP - WETUBE' 카테고리의 다른 글

delete, search handler  (0) 2021.09.24
watch, edit handler  (0) 2021.09.23
mongoose mongoDB, Schema, model 만들기  (0) 2021.09.16
5 mvp.css  (0) 2021.09.11
4-2 템플릿 pug  (0) 2021.09.11