Our First Query

 

init.js 를 만들어주자. 이 파일은 모든 걸 초기화(initialize) 시켜줄 것이다.

이 파일이 database 와 video를 import 해주고, 우리 application 을 작동시킬 것이다!

 

server.js의 내용을 옮기고, app도 export 해서 init.js 에 import 해준다.

// init.js

import "./db";
import "./models/Video";
import app from "./server";

const PORT = 4000;

const handleListening = () =>
  console.log(`✅ Server listening on port http://localhost:${PORT} 🚀`);

app.listen(PORT, handleListening);

 

오류가 나니 package.json 에서 server를 init 으로 바꿔주고,

videoController로 와서 가짜 데이터를 지워준다.

 


그렇다면 이제 video mode을 어떻게 사용할까?! 에 대해서 알아보자.

 

callback 과 promise

 

callback: 무언가가 발생하고 난 다음 호출되는 function

- javascript 에서 기다림을 표현하는 하나의 방법

// init.js 아래 내용 중 listen === callback 

app.listen(PORT, handleListening);

 

configuration (POST) 이랑 호출할 function (handleListening) 이 필요함

 

videoController 중 Video.find()에 configuration을 넣어준다.

이때 { } 즉 중괄호는 search terms 를 나타내는데, search terms가 비어 있으면 모든 형식을 찾는다는 뜻이다.

그리고 다음 단계가 callback 을 전송하는 것이다. callback 은 err 와 docs 라는 signature 를 가진다. 

 

// videoController.js

import { reset } from "nodemon";
import Video from "../models/Video";

export const home = (req, res) => {
  Video.find({}, (error, videos) => {} );
  return res.render("home", { pageTitle: "Home" });
};

 

callback 이 좋은 점은, 코드에 따라 실행되는 시간이 다를 수가 있다는 것이다. 

아래에서 start -> I finish first -> finished 의 순서대로 실행된다는 점 주의!!

export const home = (req, res) => {
  console.log("Start");
  Video.find({}, (error, videos) => {
    console.log("Finished");
    return res.render("home", { pageTitle: "Home", videos });
  });
};
console.log("I finish first");

 

 

promise: callback처럼 함수 안에 함수를 쓰는 장황한 코드 없이, 간결하게 쓸 수 있다. 

- callback 의 최신 버전

- await 을 find 앞에 작성하면 callback 이 필요없다는 점을 알아채고, find는 찾아낸 비디오를 바로 출력해준다. 

- 에러는 try / catch 로 작성. try해보고, 에러가 있다면 catch 하기.

 

 

함수 안에 또 함수를 넣으면 반영되지 않는다. 

 

 


 

document  만들기

이렇게 만들면 양식에 맞지 않는(string 적는 데에 숫자 적는다거나..) 경우에 

올바르지 않은 데이터는 document 에 기록될 수 없게 해준다.

// videoController.js

export const postUpload = (req, res) => {
  const { title, description, hashtags } = req.body;
  const video = new Video({
    title: title,
    description: description,
    createdAt: Date.now(),
    hashtags: hashtags.split(",").map((word) => `#${word}`),
    meta: {
      views: 0,
      rating: 0,
    },
  });
  console.log(video);
  return res.redirect("/");
};