몽고 사용하기
mongo
내가 가진 db 보기
show dbs
현재 사용 중인 db 확인
db
사용할 db 선택하기
use dbName
(현재 수업에서는use wetube
)
db 컬렉션 보기
show collections
db 컬렉션 안에 documents 보기
db.collectionName.find()
(현재 수업에서는db.videos.find()
)
db 컬렉션 안에 documents 내용 모두 제거하기
db.collectionName.remove({})
(현재 수업에서는db.videos.remove({})
)
mongoose middleware MDN
-> mongoose의 기능 중, 뭔가를 저장하거나 업데이트 하기 전에 이거저거 하라고 시킬 수 있음. 우리는 이걸 hashtags에 적용할 것임. express(ex: morgan)에서 본 middleware와 같다고 보면 됨.(pre, post, hook이 있음.)
-> object가 저장 혹은 업데이트 되기 전에 무엇인가를 먼저 하고 나머지(비디오 저장 혹은 업데이트)를 처리할 수 있게 해줌.
-> document에 무슨 일이 일어나기 전이나 후에 middleware를 적용할 수 있음. 예를 들면 save(or Update)를 하기 전후로 middleware를 적용하거나 function을 실행시킬 수 있음. express의 middleware과 같이 흐름을 방해하지 않음.
-> middleware의 종류(아래 사진과 같이 종류가 있음). 이 middleware에서는 this라는 인수를 갖는데, 이것은 우리가 작업을 실행해주는 문서를 가르킴.
-> middelware은 반드시! model이 형성되기 전에 만들어야함. 즉, Schema와 model사이에 만들어줘야함. 이 뜻은 model이 들어있는 js에서 middleware를 만들어줘야 한다는 뜻과도 같음.
-> middleware안에 실행할 함수는 =>(화살표)를 쓰면 안됨. 대신 "function(){}"이걸로 써줘야함!
videoSchema.pre('save', async function(){
//console.log("We are about to save: ", this);//내가 작업하는 문서의 내용(여기는 video)를 출력해줌
//this.title = "hahahah";//이런 식으로 문서의 내용을 수정할 수도 있음.
this.hashtags = this.hashtags[0].split(",").map((word) => word.startsWith("#") ? word:`#${word}`);// 여기서 hashtags[0]를 한 이유: hashtags input에 내용을 적고 save하면, 초기에 this.hashtags = ["for, new, hash, tag"] 이런 형태의 하나의 string을 가진 array로 나올 것이기 때문에.
});
-> 이게 멋지긴 하지만, 이 middleware는 update & upload(save) 둘 다에 쓰일 순 없음.
(왜냐하면, findOneAndUpdate에서는 (이거는 postEdit에 쓰이는 것) this를 쓸 수 없음. 즉, 수정하고있는 문서에 접근할 수가 없다는 뜻임.)
export const formatHashtags = (hashtags) =>
hashtags.split(",").map((word) => (word.startsWith("#") ? word : `#${word}`));
videocontroller
import {formatHashtags} from "../models/Video";
export const postUpload = async(req,res) => {
// here we will add a video to the videos array.
const { title, description, hashtags } = req.body;
try{
await Video.create({//Video.create: video를 생성하고, DB에 저장함.
title:title,
description:description,
hashtags:hashhash(hashtags), //-> function을 이용
});
return res.redirect("/");
}
catch(error){
console.log(error);
return res.render("upload",{
pageTitle:"Upload Video",
errorMessage: error._message,
});
}
}
Statics MDN
-> model에 쓰일 function을 만들 수 있음.
-> model만 import해주면 내장함수로서 사용할 수 있음.(따로 import필요 X)
-> 필요한 것: Schema.static, function, 만들고자 하는 static이름.
-> 형태: videoSchema.static(static이름, 함수)
videoSchema.static('formatHashtag', function(hashtags){
return hashtags.split(",").map((word) => (word.startsWith("#") ? word : `#${word}`))
});
//추가(수정) 코드
hashtags:Video.formatHashtag(hashtags),
//최종 코드
export const postUpload = async(req,res) => {
// here we will add a video to the videos array.
const { title, description, hashtags } = req.body;
try{
await Video.create({//Video.create: video를 생성하고, DB에 저장함.
title:title,
description:description,
hashtags:Video.formatHashtag(hashtags),
});
return res.redirect("/");
}
catch(error){
console.log(error);
return res.render("upload",{
pageTitle:"Upload Video",
errorMessage: error._message,
});
}
}
mixin video(video)
div
h4
a(href=`/videos/${video.id}`)=video.title
p=video.description
ul
each hashtag in video.hashtags
li=hashtag
small=video.createdAt
hr