node 서버에서 mongoose로 문서를 업데이트하는중 교착상태 발생에 대한 메모하나 남김니다


대략적인 프로세스는 노드서버에 한번의 리퀘스트를 보내면

몽고DB에서 문서를 하나 생성하고 시간이 많이 걸리는 api에 리퀘스트 보내고 결과를 정리하는 작업을

for문으로 실행후 결과를 배열에 취합해서 for문이 끝나면 결과값 리스트를 다시 업데이트하는 작업인데

코드는 대략 이런 모습으로 되어있음


async ctx=>{

await project.create({

...

list:[]    //나중에 업데이트 해야할 내용

})

const list=[]    //아래의 프로세스 완료후 업데이트할 배열

for(...){

/*

api요청보내서 데이터를 취합하는 for loop 프로세스

*/

try{

const res=await axios(..)

list.push(res)

}catch(e){

list.push(e)

}


//위에서 생성했던 프로젝트를 업데이트

await project.findOneAndUpdate(...,{list:list})    //여기서 아예 멈춰버림

ctx.body=(...)

}


대략이렇게 한번의 리퀘스트에서 프로젝트 생성하고 업데이트까지 2개의 처리를 진행하는데

일단 의도한대로 동작은하는데 문제는 

특정 케이스에서 저 findOneAndUpdate 부분에서 아예 코드가 멈춰버리는데

노드서버 자체가 멈춰서 먹통이되는 문제가 발생함


몇가지 케이스를 정리해봤는데

일반적인 상황에서 api서버가 정상적으로 리스폰스 했을때는 아무 문제 없었는데

저기 catch 부분에서 에러를 결과값 배열에 푸시하는걸 볼수있는데

만약 api 서버가 맛이가서 모든 요청에대해 에러가 발생했을때

list는 전부 에러로 가득찬 상태인데 이걸로 update를 하려하고 했을때 멈춰버린다는거임

mongoose timeout 설정해도 그냥 멈춰버리고 에러도 안던짐


일단 저 코드가 정상동작한다라는건 확인이 되서 코드상의 문제는 없는거같은데

대체 뭐 때문에 이런 경우가 발생하는지 원인을 파악할수가없음

더 이상한건 테스트 해본다고 저 list를 json으로 만들어서 node에서 직접 update 구문 실행했을땐 또 문제없이 동작함



일단 좀더 예제를 찾아봐야할듯