코딩/Today I Learn

11/30 공부

코딩쪼렙 2021. 11. 30. 13:19
728x90

비디오 만들기

 1.create videoDocument width data

2.save document into database

 

1.template 수정

extends base

block content 
    form(method ="POST")
        input(placeholder="Title", required, type="text", name="title")
        input(placeholder="Descirption", required, type="text", name="descirption")
        input(placeholder="Hashtags, separated by comma.", required, type="text", name="hashtags")
        input(type="submit", value ="Upload video")  

 

꼭 input에 name 적어주기!!

 

 

export const postUpload = (req, res) => {
  const { title, descirption, hashtags } = req.body;  // input에 이름 넣어준 이유 const title = req.body.title
  const video = new Video({  // 비디오 모델 
    title,            // title: title(req.body.title)
    descirption,  // description : description(req.body.description)
    createdAt: Date.now(),
    hashtags: hashtags.split(",").map((word) => `#${word}`),  //
    meta: {
      views: 0,
      rating: 0,
    }
  });
  console.log(video);
  return res.redirect("/");
}

map() 메서드는 배열 내의 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다.

startsWith() 메소드는 어떤 문자열이 특정 문자로 시작하는지 확인하여 결과를 true 혹은 false로 반환합니다.

trim() 메서드는 문자열 양 끝의 공백을 제거합니다. 

 

hashtags
.split(",")
.map((word) =>
!word.trim().startsWith("#") ? `#${word.trim()}` : word.trim()
)

 

console.log(video)를 보면 mongoose가 id를 부여해줌

object는 document처럼 id가 필요 

새 object는 javascript에만 존재하고 db에존재하지않음 --> 아직 저장안됌 

-----------------------------------------------------------------------------------------------------------------------------------

이제 database에 전송할 차례

 

const Video = mongoose.mode("Video", videoSchema)l 

비디오가 몽구스모델이기 때문에 다양한 기능 사용 할 수있다.

video.save() - promise를 return 해줌 

save 작업이 끝날 때까지(데이터베이스에 저장되는 것은 자바스크립트 외에 위치해서 시간이 걸리기때문에  ) 기다려야함 

--> async await 적어줌 

 

 

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

데이터베이스에 저장이 되었고 

홈에 들어갈 때마다 video.find()로 데이터를 찾아줘서 

새로고침해도 파일이 저장되어있음 

 

export const home = async (req, res) => {
    const videos = await Video.find({});

    console.log(videos);
    return res.render("home", { pageTitle: "Home", videos });
};

 

-------------------------------------------------------------------------

이제 

> mongo  //몽고 콘솔 사용하기

> show dbs  // youtube 파일 뜸

> use youtube 

> show collections // documents의 묶음 video 뜸

>db.videos.find() // object 다보임 

 

지금 위에 document만드는 코드 

const ㅁ = new ㅅ

ㅁ.save();

 

또는 

await ㅁ.create 만 사용해도됨 

이렇ㄱ ㅔ

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

 

 

-----

MongoDB의 collection이름이 Video가 아닌 videos인 이유
Mongoose는 자동으로 모델을 찾고, 해당 모델의 이름을 따서 소문자+뒤에 s(복수형)을 붙여 컬렉션을 생성합니다.
Tank 모델은 -> 컬렉션에 저장될 때, tanks로 저장됩니다.

Document.prototype.save()
https://mongoosejs.com/docs/api.html#document_Document-save

Model.create()
하나 이상의 문서를 데이터베이스에 저장하기 위한 손쉬운 방법입니다.
MyModel.create(docs)는 문서의 모든 문서에 대해 새로운 MyModel(doc).save()를 수행합니다.
create()을 하게 되면 save()를 생략할 수 있습니다.
create()이 다음 미들웨어인 save()를 트리거하기 때문입니다.
https://mongoosejs.com/docs/api.html#model_Model.create

Collection: Document들을 담고 있는 묶음