12.03공부 2
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