http 파일 다운로드(request-promise) 후 파일 저장(fs.createwritestream, pipe) 시 error handling 질문입니다.

조회수 965회

안녕하세요. nodejs 로 웹에서 파일 다운로드 후 압축해제를 하는 기능을 만들어보고 있는데요.
베이스 코드는 다 짰는데 리팩토링 하는 과정에서 에러 핸들링 하는 방식이 궁금해서 질문 드립니다.

일단 비동기 방식을 처리하기 위해 async와 await을 사용하였고

동작 방식은

1) request 모듈로 파일을 다운로드 후
2) pipe를 연결하여 createWriteStream 으로 파일을 쓰는 형태입니다.
(request와 stream은 둘다 promise 모듈 패키지를 설치하였습니다.)

사용하는_프로그래밍언어
const rp = require('request-promise'),
    promise = require('bluebird'),
    fs = require('async-file');

function b() {
    return new promise(async (resolve, reject) => {
        const fw = fs.createWriteStream('a.html');
        let options = {
            method: 'GET',
            uri: 'https://www.naver.com',
            qs: undefined,
            body: undefined,
            rejectUnauthorized: false,
            json: true
        };
        await rp(options)
            .pipe(fw)
            .on('error', err => {
                console.log('==pipe err');
                reject(err);
            })
    });
}

async function a() {
    try {
        //await 있는 async 호출
        await b();
        console.log('file write end!, async check');
    } catch (err) {
        //await 은 promise error 발생시 아래 에러로 떨어진다.
        console.log('==catch err');
        console.log(err);
    }
}
a().then(() => {
    console.log('==finish!');
});

여기서 에러 핸들링 처리를 하려고 하는데
1) request에서 잘못된 URL을 넣었을때 발생하는 에러에 대한 핸들러를 어떻게 구성해야 될지 모르겠습니다. 아래와 같이 마지막에 catch로 에러 핸들링해도 문제이고

        await rp(options)
            .pipe(fw)
            .on('error', err => {
                console.log('==pipe err');
                reject(err);
            }).catch(err => {
                reject(err)
            });

promise 뒤에 에러처리를 할경우 에러는 잡히는데 뒤에 filestream pipe가 동작을 하지 않습니다.

        await rp(options)
            .catch(err => {
                reject(err);
            })
            .pipe(fw)
            .on('error', err => {
                console.log('==pipe err');
                reject(err);
            });

어떤 방식으로 구현을 해야 request에 대한 에러가 발생했을때 처리가 가능할지 궁금하여 질문 드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 이미 rp가 에러가 났으면 pipe는 동작하지 않아야 될거 같은데요. 하나의 파이프라인인데 중간에 끊기면 뒤에 것은 안하는게 맞는게 아닐런지... doodoji 2019.12.26 16:24

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)