제로하우스

[비동기 예제] fs 모듈을 활용한 파일 읽기 본문

기타/코드스테이츠 블록체인 부트캠프

[비동기 예제] fs 모듈을 활용한 파일 읽기

송제로투 2022. 5. 19. 01:12

📌 목적

  • fs 모듈을 활용하여 "파일 열기"를 구현한다.
  • callback과 Promise를 구현한다.
  • 텍스트 파일을 JSON.parse()를 통해 다른 언어들이 이용할 수 있도록 파싱한다.

 

📌 fs 모듈

File System 모듈은 Node.js의 내장 모듈이다. fs 모듈을 활용하여 파일 읽기, 파일 쓰기 등의 작업을 할 수 있다.

const fs = require("fs");

 

1. callback tc

파일 경로와 콜백함수를 입력받는다. 파일을 읽고, 에러가 발생한 경우에는 callback 함수에 데이터를 null로 넘겨주고, 이외의 경우에는 데이터를 넘겨준다.

const fs = require("fs");

const getDataFromFile = function (filePath, callback) {
  // TODO: fs.readFile을 이용해 작성합니다
  fs.readFile(filePath, 'utf8', (err, data) => {
    if (err) {
      callback(err, null)
    }
    else {
      callback(null, data)
    }
  })
};

getDataFromFile('README.md', (err, data) => console.log(data));

module.exports = {
  getDataFromFile
};

 

2. promise tc

Promise 객체를 return하도록 한다.Promise는 (resolve, reject)를 인자로 받고, 파일을 읽은 후 에러가 발생한 경우에는 reject(err), 데이터를 성공적으로 받은 경우에는 resolve(data)가 되도록 한다.

const fs = require("fs");

const getDataFromFilePromise = filePath => {
  // TODO: Promise 및 fs.readFile을 이용해 작성합니다.
  return new Promise((resolve, reject) => {
    fs.readFile(filePath, 'utf-8', (err, data) => {
      if (err) {
        reject(err)
      }
      else {
        resolve(data)
      }
    })
  })
};

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

module.exports = {
  getDataFromFilePromise
};

 

3. basic chaining tc

then을 활용한다. 받아온 데이터를 JSON.parse()를 이용하여 JSON 객체로 변환한 후 result 배열에 넣고 반환한다.

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');

// HINT: getDataFromFilePromise(user1Path) 맟 getDataFromFilePromise(user2Path) 를 이용해 작성합니다
const readAllUsersChaining = () => {
  // TODO: 여러개의 Promise를 then으로 연결하여 작성합니다
  return new Promise((resolve, reject) => {
    let result = []
    getDataFromFilePromise(user1Path)
      .then((data) => {
        result.push(JSON.parse(data))
        // return을 하지 않으면 아래 then에서 data를 받지 못한다
        return getDataFromFilePromise(user2Path)
      })
      .then((data) => {
        result.push(JSON.parse(data))
        resolve(result)
      })
  })
}

readAllUsersChaining();

module.exports = {
  readAllUsersChaining
}

 

4. Promise.all tc

Promise.all() 메서드를 활용하여 promise에서 데이터를 하나로 묶어 관리하며 처리한다.

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 readAllUsers = () => {
  // TODO: Promise.all을 이용해 작성합니다
  const user1 = getDataFromFilePromise(user1Path)
  const user2 = getDataFromFilePromise(user2Path)

  return Promise.all([user1, user2])
  .then((values) => {
    return values.map((value) => JSON.parse(value))
  })
}

readAllUsers()

module.exports = {
  readAllUsers
}

 

5. async&await tc

async와 await를 이용하여 처리해본다.

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 readAllUsersAsyncAwait = async () => {
  // TODO: async/await 키워드를 이용해 작성합니다
  result = []
  let user1 = await getDataFromFilePromise(user1Path)
  let user2 = await getDataFromFilePromise(user2Path)

  result.push(JSON.parse(user1))
  result.push(JSON.parse(user2))
  return result
}

readAllUsersAsyncAwait();

module.exports = {
  readAllUsersAsyncAwait
}
Comments