Typescript + RxJS로 fs.readFile 사용하기

bindNodeCallback을 활용하여 fs.readFile 사용하는 방법

Typescript + RxJS 환경에서 bindNodeCallback 함수를 사용하는 방법을 참고하기 위해 작성한다.


bindeNodeCallback 함수는 Callback 함수를 Observable로 리턴하도록 매핑해주는 역할을 한다. 이를 이용해 fs.readFile를 매핑해보자.

readfile 함수는 다음과 같이 선언되어 있다.

function readFile(path: PathLike | number,
                  options: { encoding: string; flag?: string; } | string,
                  callback: (err: NodeJS.ErrnoException | null, data: string) => void): void;

fs version: 0.0.1-security

이 함수의 parameter를 그대로 복사해서 fs.readFile를 리턴하는 익명 함수의 인자에 넣어준다. (아래 코드에서 readFileStructure)

readFileStructurebindNodeCallback의 argument로 넣어주면 끝이다.

자세한 내용은 코드를 참조하자.

import * as fs from 'fs';
import { bindNodeCallback, Observable } from 'rxjs';

export class RxCallbackService {
    private readonly readFileCallback$: (...args: any[]) => Observable<any>;

    constructor() {
        const readFileStructure = (
            path: string,
            encoding: string,
            callback: (err: NodeJS.ErrnoException | null, data: string | Buffer) => void,
        ) => fs.readFile(path, encoding, callback);
        
        this.readFileCallback$ = bindNodeCallback(readFileStructure);
    }

    readFile$(path: string, encoding: string) {
        return this.readFileCallback$(path, encoding);
    }
}

// how to use
const rxCallbackService = new RxCallbackService();
const token$ = rxCallbackService.readFile$('token.json', 'utf-8'); // return Observable type

bindNodeCallback을 사용할 때 항상 헷갈렸는데, 변환할 함수의 함수 structure를 그대로 가져온다는 게 핵심이다.


© 2019. All rights reserved.