| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- java8
- Spring
- elasticsearch
- 엘라스틱서치
- 자바
- 이펙티브
- Spring Boot
- Web
- MySQL
- nodejs
- boot
- Git
- javascript
- 스프링
- 맛집
- 리뷰
- RCP
- java
- kibana
- 독후감
- JPA
- jface
- node
- 알고리즘
- 백준
- 후기
- 인터페이스
- effective
- error
- 자바스크립트
Archives
- Today
- Total
wedul
node js에서 stream pipe 사용시 에러 처리 방법 본문
반응형
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 |