코딩/Today I Learn

12.03공부 2

코딩쪼렙 2021. 12. 3. 22:33
728x90

delete 페이지만들기 

1.watch.pug 템플릿에 

ui추가 

extends base.pug 
block content 
     div
        p=video.description
        small=video.createdAt
     a(href=`${video.id}/edit`) Edit video → 
     br
     a(href=`${video.id}/delete`) Delete video &rarr

 

2.비디오 라우터에 경로 추가

videoRouter.route("/:id([0-9a-f]{24})/delete").get(deleteVideo);

 post하지 않음 !  해당 경로에 방문하면(get) video가 delete됨 

 

3.video Controller

router에 import deleteVideo

export const deleteVideo = async (req, res) => {
  const { id } = req.params;
  await Video.findByIdAndDelete(id);  //async, await은 몽구스
  //delete video
  return res.redirect("/");
}

findByIdAndDelete(id)는 findOneAndDelete({ _id: id })

의 단축어이다.

 

Model.findOneAndDelete()
Model.findOneAndRemove()
대부분의 상황에서 타당한 이유가 없는 한 delete를 사용하라고 되어 있음.

 

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

search

 

mongoose가 좋은 점 중 하나는 훌륭한 query engine을 갖고있다.

문서를 보여주는 방식을 수정 할 수있고 어떻게 검색, 정렬 수정 등 여러가지 할 수 있다.

 

export const home = async (req, res) => {
  const videos = await Video.find({}).sort({createdAt :"desc"});  //정렬, 내림차순으로 createdAt  asc:오름차순
  return res.render("home", { pageTitle: "Home", videos });
};

 

//ascending 오름차순 descending 내림차순

 

옵션 1

export const search = async (req, res) => {
  const { keyword } = req.query; //req.query is for the URL data.  form when we use get method
  if (keyword) {  //검색안하고 페이지에 들어왔을 때  keyword=undefined 콘솔 찍으면나옴

      const videos = await Video.find({
      title: keyword, //filter로 검색
    }); //videos는 해당 버블 안에서만 존재하기 때문에 
    return res.render("search", { pageTitle: "Search" ,videos });
   }
  return res.render("search", { pageTitle: "Search" ,videos });

    return res.render("search", { pageTitle: "Search" });

}

//여기에 videos못 넣음 검색할 때마다 키워드가 없으면 undefined를보내고 에러가 뜨기 때문에eifned가 되고 에러가 뜨기 때문에 

 

 

 

옵션2

export const search = async (req, res) => {
  const { keyword } = req.query; //req.query is for the URL data.  form when we use get method
  let videos = []; //배열을 만들ㅇ서 
  if (keyword) {  //검색안하고 페이지에 들어왔을 때  keyword=undefined 콘솔 찍으면나옴

       videos = await Video.find({  //업데이트하는 방식으로 
      title: keyword,
    });
    return res.render("search", { pageTitle: "Search" ,videos });
   }

}

 

---> 검색을 토시 하나도 안 틀리게적어야지 검색됨

--->  정규 표현식을 이용해 검색하기  검색어를 포함하거나 검색어로 끝나거나 시작하는것 검색 

/welcome/ig //welcome 포함, ignore uppercase,lowercase, global

/welcome$/ig //welcome으로 끝나는 제목

/^welcome/ig //welcome으로 시작하는 제목

 

정규표현식을 query에 포함할 수있음 (mongodb가 수행함)

 

 if (keyword) {  //페이지에 들어왔을 때  keyword!=undefined
    videos = await Video.find({ //filter
      title: {
        $regex: new RegExp(keyword, "i") //regular expression 줄임 , keyword 포함한 제목,  welcome ,Welcome ignore
        $regex: new RegExp(`^${keyword}`, "i") //keyword로 시작하는 제목만

        $regex: new RegExp(`${keyword}$`, "i") 

       $gt: 3  //greater than 3보다 큰 수 예) 조회수가 3보다 큰 수 검색할 때 
      },
    });
    console.log(videos);
  }

 

[정규표현식]
https://www.regexpal.com

[몽고DB regex]
https://docs.mongodb.com/manual/reference/operator/query/regex

[RegExp mdn]
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/RegExp