mongoose는 DB를 움직이게끔 만드는 함수를 우리에게 제공한다. 첫번째로, 홈페이지가 로드 되었을때 영상을 찾는 함수가 있다. 우리의 영상 객체는 Video이므로 코드는 다음과 같다. 하지만 아직 코드는 실제로 영상을 찾는 기능을 하지는 않는다.
export const home = (req, res) => {
console.log("첫번째");
Video.find({}, (error, videos) => {
console.log("두번째");
});
console.log("세번째");
return res.render("home", { pageTitle: "Home", videos: [] });
};
Video.find 는 callback함수를 호출한다. 여기서 callback 함수의 특징을 알 수 있다. 위의 코드를 실행하면, 다음과 같이 콘솔창에 출력된다.
Server listening on port http://localhost:4000
Connected to DB!
첫번째
세번째
GET / 304 95.411 ms - -
두번째
home 함수가 실행되면서, 일단 첫번째 콘솔로그가 출력되고, 세번째 콘솔로그가 다음에 출력된다. 그리고 페이지가 렌더링 된 후에, Video.find 안의 함수는 callback 함수 이기 때문에 마지막에 실행이 된다.
콜백함수의 장점은 인자로 error을 받을 수 있기 때문에, 쉽게 에러를 확인할 수 있다는 것이다.
하지만 단점으로는 특정함수안에 콜백함수를 또 작성해야한다는 번거로움이 있다. 따라서 비슷한 기능을 하는 promise를 사용할 수 있다.
export const home = async (req,res) => {
try {
const videos = await Video.find({});
return res.render("home", {pageTitle: "Home", videos });
} catch(error) {
return res.render("server-error");
}
};
async , await가 promise의 방법이다. 이 방법은 콜백과는 다르게 코드를 그냥 직관적으로 위에서 아래로 읽는다. 그대신 await이 나온 라인을 만나면 해당 작업을 다 할때까지 기다린다. 다음줄을 실행 시키지 않는다. 위의 코드에서는 DB로부터 video들을 모두 찾을때까지 기다린다. 그 과정이 완료되면 다음 코드를 실행한다.
await는 꼭 async 함수 내에서만 사용이 되어야 한다. 위에서 볼 수 있다시피, 에러를 처리하기 위해서는 try-catch문을 사용해야 한다.
'Youtube Clone Coding' 카테고리의 다른 글
영상 수정하기 (0) | 2022.11.09 |
---|---|
Video 만들기 (0) | 2022.11.09 |
DB Schema (0) | 2022.11.04 |
Mongo에 연결하기 (0) | 2022.11.04 |
MongoDB & Mongoose (0) | 2022.11.04 |