CRUD -2 / MiddleWare

길고 꾸준하게·2022년 5월 24일
0
post-thumbnail

머리속에서 짬뽕이되있는게 많아서 요약하느라 시간이좀 걸렸다..

CRUD -2

Read

몽구스의 공식문서에 보면 Model은 기본적인 CRUD에 도움을 주기위한 정적인 함수 (static function)들을 제공한다고 되어있고.
정~~말 많은 종류의 CRUD에 도움을 주는 함수들이 있다.
그리고 이것들은 전부 'mongoose Query'를 리턴한다 -> QueryMiddleWare가 있는데 그때 Query가 이건가부다.

그리고 이 Query가 .then함수를 가지고있기때문에 Promise로도 사용될수 있다 -> 그래서 async/await이 가능한가부다

//in async function

const data = await Model.find({})  // find all data

const data = await Model.find(filter)

const data = await Model.findById(id)

많은 방법이 있다. await을 안쓴다면 아마 save()를 해줘야지 될거다.(전 포스팅 참조)

리턴하는 Query가 제공하는 메서드로 정렬된 데이터를 가져올수도 있다

const SortedData = await Model.find({}).sort({target:"desc"})

JavaScript가 제공하는 sort랑은 다른거다;;
MongoDB가 강력한 오퍼레이터를 제공해서 정규식을 이용한 find도 가능하다
https://www.mongodb.com/docs/manual/reference/operator/query/expr/

const data = await Model.find({target:regExp})

//Model.find({
	key:{
    	$regex: regex (ex: new RegExp(pattern) )
    }
})

mongoose가 제공하는게아닌 MongoDB가 제공하는거다 몽구스는 다리역할을 하는것뿐. (실제 오퍼레이터의 사용은 $형태인 아래케이스다)

Update

await Model.findByIdAndUpdate(id,{
	update body
})

너무 많은 메서드들이있어서 다 쓰진 못하고
Detail하게도 가능하다는 의미로 findByIdAndUpdate를 적어줬다

Delete

mongoose에선 remove,delete중에 가급적이면 delete를 쓰라고 되어있다.

공식문서에 remove,delete 두가지 방법이있는데 무슨 차이인지는 안나와있고
검색결과 remove는 복구 불가능하게 지워진다고 해서 가급적이면 delete를 쓰라고 한다

await Model.findByIdAndDelete(id)

마찬가지로 detail한부분이 가능하단 의미로 적은 findByIdAndDelete()

MiddleWare

몽구스에도 미들웨어가 있다.

  • 몽구스의 미들웨어는 스키마(Schema)레벨에서 지정된다.
  • pre / post hooks라고도 불린다
  • 문서(document),모델(model),쿼리(query)미들 웨어가 있고
  • 각 미들웨어는 this를 가지고있으며 각각의 문서,모델,쿼리를 참조한다.

내가알기로는 콜백함수에서 this는 화살표함수 / 함수선언식 인지에 따라서 this가 참조하는 컨텍스트가 갈리는걸로 알고있다. 그래서 안전하게 일단 함수선언식으로 해줬다.
=>

query.middleware의 findOne으로 테스트 결과
내생각이 맞았고 함수선언식으로 써준 this는
query를 잘 참조하는 반면 화살표함수로 써준 this는 undefined가 나왔다.

헤헤

create

Schema.pre(MiddleWare_type,handleFun)

미들웨어 타입은 document,query,model미들웨어별로 다르다
위의셋 미들웨어를 구분지어서 create하는건 아니고
미들웨어타입에 따라서 몽구스가 알아서 위의셋중 해당 미들웨어 타입이 있는 미들웨어를 정하는것같다.


근데 공식문서를 보면

document / model / query 미들웨어에서 각각 중복되는 미들웨어 타입이 있다 (미들웨어 종류는 다르지만 타입의 이름이 같은)

ex: document 미들웨어의 remove / query 미들웨어의 remove

default는 document미들웨어이며 query미들웨어에서의 remove를 쓰고싶은거였다면 옵션을 추가해주면 된다.

schema.pre('remove',{query:true,document:false})

'미들웨어(MiddleWare)'기 때문에 save이벤트가 발생하면 해당 미들웨어를 거쳐갈거다.

그말은 내 입맛대로 중간에 커스텀을해서 데이터를 저장하는 setter / getter의 역할을 해줄수 있겠다 싶다.

next()

미들웨어니까 next()가 있어야겠지만 몽구스의 신버전 부터는 next()대신 promise를 리턴하는 함수를 쓰거나 / async함수를 쓸수있다

(근데 async함수도 프로미스를 리턴하는함수니까 같은말 아닌가?)


재밌구만

profile
작은 나의 개발 일기장

0개의 댓글