Enjoy Programming

[mongoose] exists(), middleware, static 본문

JavaScript/Node.JS

[mongoose] exists(), middleware, static

LEETAEEON 2021. 6. 5. 13:32

몽고db를 사용을 위해 mongoose를 사용하던 중

업로드한 파일을 수정시 파일이 있는지 여부를 체크할때 기존 findById로 video객체를 전부 불러와

있는지 확인했다.

 

그런데~ 더 간단? 하게 확인 할 수 있는 방법이 있는데 바로 Model.exists()를 사용하면 된다.

exists() function은 Promise를 return하는데

데이터베이스에 해당 필터와 일치하는 문서가 하나 이상이 있으면 true를 반환하고 아니라면 false를 반환한다.

여기서 filter는 object이다. callback함수도 필요하다고 doc에는 나와있으나

async await을 이용해 콜백없이 사용해본다.

기존 해당 비디오가 있는지 판단후 없다면 오류메세지를 반환하는 코드이다.

exists를 사용해서 동일하게 확인하는 절차를 거친 코드이다.

 

코드상에서는 뭐 별 변화가 없다. 그러나 필자가 생각하기에는~ 아무래도 서버를 돌리는 환경에서

수많은 접속자가 있을텐데 하나하나 해당 object를 가지고 와서 하는 것보다. 바로 db상에서 존재하는지 확인하고

true와 false를 return받는 편이 가볍지 않을까 생각한다 . 고로 exists가 더 좋은 코드라 판단된다.

 

한가지 주의할 점은 여기서는 template에 video객체를 넘겨주는 일이 없기에 사용을 하는 것이지만

화면에 video를 뿌려준다거나 할때는 해당객체를 넘겨줘야 하므로 꼭 findById를 사용하자.

 

 

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

 

middleware

 

mogoose에도 express처럼 middleware가 있다~!~!~!  

해당 코드를 실행하기 전처리 해주는 기능이라고 생각하면 된다. 

 

예를들어 mongodb 스키마에 hashtags라는 propdmf array로 넘겨준다고 생각해보자.

 

비디오를 수정하는 컨트롤러에서 hashtag를 받을때 split함수를 이용해 배열화 해주고

map함수를 이용해 각 단어에 #이 있으면 그대로 사용하고 없으면 #을 붙여주는 코드이다.

이렇게 써도 무방하지만 ~ 업로드라던지~ 또다른 hashtag를 받는 컨트롤러들이 있으면 이 코드듣을 계속 복붙해야한다.

코드 수정시에도 모두 접근해야하는 번거로움이 있다.

 

이를 해결하기위해 middleware를 사용할 수 있는데 video모델 파일로 가서

pre를 이용해 middleware를 작성해준다.

middleware는 반드시 해당 모델을 정의해주기 전에~ 사용하자 순서는 매우 중요하다.

아무튼 pre를 이용해 save를 이용시 callback함수를 사용해주는데 이때 this를 이용한다.

해당 hashtag의 0번쨰 배열을 split과 map을 이용해 이전처럼 배열화 해준다.

왜 0번째 배열이냐..하면 컨트롤러상에 prop이 hashtags로만 받으면 form에서 전송된 데이터는

[ '배열,이지만,한개에,string으로,배열이,만들어진다'] 이런식으로 하나의 string으로 인식하기에 0번째 index요소를

" , " 로 separate해서 배열화 해주는 것이다.

 

이것도 좋지만 문제는 pre의 경우 findByIDAndUpdate같은 static function은 적용이 되지 않는다.

 

그래서 해결책으로  static을 이용해보았다.

static은 쉽게 생각해 아에 findById, save, replaceOne 같은  static helper function으로 만들어 

내장함수 처럼 사용한다 생각하면 되겠다~

어디서든 사용 가능하다는 것이다. 굳이 함수를 만들어 export import할 필요도 없이

사용 가능하다.

 

static을 이용해 formatHashtags라는 static helper function을 만들어 줬다.

그리고 컨트롤러상에서 Model.function(prop)을 해주면 끝!!

아주 간단하고 편리하다

좋은 걸 배웠다.