2021.2.1 / fs 모듈로 callback, promise 구현(1/2)

Mono crom·2021년 2월 1일
0

1. node.js 내장모듈 사용방법

브라우저에서는 <script src="something.js"></script> 와 같이 script 태그를 이용했지만, node.js 에서는 js코드 상단에 require 구문을 이용하는 것으로 모듈을 가져올 수 있다.

const fs = require('js') // file system module 을 불러온다.
const dns = require('dns') // DNS module 을 불러온다

2. 서드파티 모듈 사용방법

node.js 에서 공식적으로 제공하지 않는 서드파티 모듈을 사용하기 위해서는 우선 설치를 해야 한다.
$ npm install underscore
가령 서드파티 모듈인 underscore 를 가져와 사용하고 싶다면, 위 명령어를 입력해 우선 내 로컬에 설치는 하고, 그 다음 require 구문을 이용해 가져와 사용할 수 있다.

const underscore = require('underscore');

3. fs 모듈을 이용한 callback 구현

const fs = require("fs");

// getDataFromFile함수(이하 get함수) 가 전달받는 2개의 인자 확인
const getDataFromFile = function (filePath, callback) {

  // filePath 에 있는 파일을 utf-8 형식으로 조회한다.
  // 조회에 성공하면 그 내용이 data 인자에 담기고, 조회할 수 없는 경우 익명함수 err를 던질 수 있음
  fs.readFile(filePath, "utf8", (err, data) => {
    if (data === undefined) {
      // 조회에 실패한 경우 data 는 null 이고, err 를 첫 번째 인자로 하여 callback 호출
      callback(err, null);
    } else {
      // 조회에 성공한 경우 err 는 null 이고, data 를 두 번째 인자로 하여 callback 호출
      callback(null, data);
    }
  });
};

// "README.md" 가 filePath, 화살표함수가 callback 함수
getDataFromFile("README.md", (err, data) => {
  // 이하의 함수내용이 callback 인자로 넘어감
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});

4. fs 모듈을 이용한 Promise 구현

// filePath 인자를 받아서 2줄 아래 readFile 함수의 인자로 갖다 쓸거임
const getDataFromFilePromise = (filePath) => {
  
  // filePath 열람 성공 시 .then 메소드에 data를 넘기고, 실패 시 err 넘김
  return new Promise((resolve, reject) => {
    fs.readFile(filePath, "utf8", (err, data) => {
      if (data === undefined) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
};

getDataFromFilePromise('README.md').then(data => console.log(data));

5. then 체이닝

const path = require("path");
const { getDataFromFilePromise } = require("./02_promiseConstructor");

const user1Path = path.join(__dirname, "files/user1.json");
const user2Path = path.join(__dirname, "files/user2.json");


const readAllUsersChaining = () => {

  // 꼬리를 잇는 then의 data 에 각각 어떤 값이 전달되는지가 포인트
  return new Promise((resolve, reject) => {
    let result = [];
    getDataFromFilePromise(user1Path)
    // 여기서 data 는 get 함수의 호출결과인 user1Path의 내용을 담은 data
      .then((data) => {
        result.push(JSON.parse(data));
        return getDataFromFilePromise(user2Path);
      })
    // 위 then에서 user2Path 의 data를 반환하므로 아래 data에는 해당 반환값이 전달됨
      .then((data) => {
        result.push(JSON.parse(data));
      // resolve 를 호출함으로써 result 를 반환하면서 Promise함수 종료
        resolve(result);
      });
  });
};
readAllUsersChaining();
profile
니가 진짜로 원하는게 뭐야

0개의 댓글