반응형
node js에서 데이터를 stream을 사용하여 처리하고 pipe를 사용해서 계속해서 stream을 가지고 작업을 이어나갈 수 있다. 그런데 pipe를 통해서 작업을 진행하다 보니까 중간에 오류가 발생했을 때 try / catch 로는 정상적으로 처리하지 못하는 경우가 발생했다.
나에 경우에는 에러가 발생했을 때 try / catch에서 잡히지 않아서 프로그램이 Unhandled Promise Rejections를 출력 하며 죽어버렸다.
그 예는 다음과 같이 request를 통해서 받은 이미지를 sharp 라이브러리를 통해서 이미지 크기를 변경하려고 할 때 발생했다.
1 | try { await request('https://image.toast.com/aaaaab/ticketlink/TKL_3/ion_main08061242.jpg').pipe(transformer).pipe(writeStream); } catch (e) { console.error(e); } | cs |
그래서 이를 처리하기 위해서 알아봤는데 각 파이프라인에서 발생하는 에러를 처리하기 위해서는 try/catch로만 잡을 수가 없다. 그래서 이를 해결하기 위해서 각 파이프 앞단에서 error 이벤트를 잡는 설정을 해줘야한다.
1 2 3 4 5 6 7 8 | // 파일로 쓰기 await request('https://image.toast.com/aaaaab/ticketlink/TKL_3/ion_main08061242.jpg').on('error', function (e) { console.error(e); }).pipe(transformer).on('error', function (e) { console.error(e); }).pipe(writeStream).on('error', function (e) { console.error(e); }); | cs |
하지만 이렇게만 하면 에러는 잡을 수 있어도 pipe에서 행이 걸리는 경우가 발생된다. 그래서 에러가 발생했을 때 행 걸리지 않고 다음 로직으로 정상적으로 처리되도록 하기 위해서는 this.emit('end')를 넣어줘야 한다.
1 2 3 4 5 6 7 8 9 10 11 | // 파일로 쓰기 await request('https://image.toast.com/aaaaab/ticketlink/TKL_3/ion_main08061242.jpg').on('error', function (e) { console.error(e); this.emit('end'); }).pipe(transformer).on('error', function (e) { console.error(e); this.emit('end'); }).pipe(writeStream).on('error', function (e) { console.error(e); this.emit('end'); }); | cs |
참고
https://stackoverflow.com/questions/21771220/error-handling-with-node-js-streams
반응형
'web > node.js' 카테고리의 다른 글
node.js oauth2 server 만들기 (1) | 2018.11.25 |
---|---|
Promise에서 Unhandled Rejection 설명 (0) | 2018.11.09 |
node.js에서 sharp를 사용해서 이미지 크기 변경하기 (0) | 2018.10.22 |
maxmind의 geoLite2를 이용해서 접속한 사용자의 지역정보 가져오기 (0) | 2018.10.16 |
node.js express에서 request 사용자 아이피 찾기 (0) | 2018.10.15 |