프론트엔드 개발/Javascript

Node.js 내장 모듈 fs(File System)

밈밈이 2022. 11. 28. 00:06

fs(File System) 모듈

File System 메서드 중 fs.readFile 은 로컬에 존재하는 파일을 읽어옵니다.

fs.readFile(path, [,options], callback)

비동기적으로 파일 내용 전체를 읽습니다.
이 메서드는 는 3개의 전달인자를 받습니다.

 

 

 path \ < string > | \ < Buffer > | \ < URL > | \ < integer >

path에는 파일 이름을 전달인자 로 받습니다.
네 가지 종류의 타입을 넘길 수 있지만 일반적으로 문자열()의 타입을 받습니다.

 

● options \<Object> | \<string>

options는 넣을 수도 있고, 넣지 않을 수도 있음. 대괄호는 선택적 전달인자를 의미!

options는 문자열 또는 객체 형태로 받을 수 있다.

 //문자열로 전달할 경우 인코딩을 받는다.
 // /etc/passwd 파일을 'utf8'을 사용하여 읽음.
 
fs.readFile('/etc/passwd', 'utf8', ...);
//객체로 전달할 경우

let options = {
  encoding: 'utf8', // utf8 인코딩 방식으로 엽니다
  flag: 'r' // 읽기 위해 엽니다
}

// /etc/passwd 파일을 options를 사용하여 읽습니다.
fs.readFile('/etc/passwd', options, ...)

callback \<Function>

  • err \<Error> | \<AggregateError>
  • data \<string> | \<Buffer>

콜백 함수를 전달. 파일을 읽고 난 후에 비동기적으로 실행되는 함수.

에러가 발생하지 않으면 errnull 이 되며,

data 에 문자열이나 Buffer 라는 객체가 전달됨.( data 는 파일의 내용 )

인코딩을 하게 되면 문자열로 반환되고 그렇지 않은 경우 buffer라는 객체가 전달됩니다.

 

 

 

 

파일을 불러오는 메서드 readFile 메서드 사용법

// 파일을 불러오는 메서드 readFile 메서드 사용법
const { readFile } = require("fs");

const getDataFromFile =  (filePath, callback) => {
  readFile(filePath, "utf8",  (err, data) => {
    if (err) {
      callback(err, null);
    } else {
      callback(null, data);
    }
  });
};

callback 이라는 매개변수(parameter) 대신, Promise의 resolve, reject 함수를 이용하세요.

//callback 이라는 매개변수(parameter) 대신, Promise의 resolve, reject 함수를 이용하세요.

const { readFile } = require("fs");

const getDataFromFilePromise = filePath => {
  return new Promise((resolve, reject) => {
    readFile(filePath, "utf8", function (err, text) {
      if (err) {
        reject(err);
      } else {
        resolve(text);
      }
    });
  });
};

user1.json 파일과 user2.json 파일에 담긴 것

//user1 

{
  "name": "김코딩",
  "age": 26,
  "sex": "Male",
  "company": {
    "name": "코드스테이츠"
  }
}


//user2
{
  "name": "박해커",
  "age": 40,
  "sex": "Female",
  "company": {
    "name": "Anonymous"
  }
}

 

 

앞서 작성한 getDataFromFilePromise를 이용해서 풀어야 합니다.
getDataFromFilePromise를 이용해, 'files/user1.json', 'files/user2.json' 파일을 불러오고, 
두 파일을 합쳐서 최종적으로 두 객체가 담긴 배열을 만드는 것이 목표.

//앞서 작성한 getDataFromFilePromise를 이용해서 풀어야 합니다.
//getDataFromFilePromise를 이용해, 'files/user1.json', 'files/user2.json' 파일을 불러오고, 
//두 파일을 합쳐서 최종적으로 두 객체가 담긴 배열을 만드는 것이 목표.


const path = require('path'); // path모듈 불러오기
const { getDataFromFilePromise } = require('./02_promiseConstructor'); //파일불러오기

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

const readAllUsersChaining = () => {
  return getDataFromFilePromise(user1Path) 
    .then(user1 => { 
      return getDataFromFilePromise(user2Path)
      .then(user2 => {
        return '[' + user1 + ',' + user2 + ']';
      });
    })
    .then(text => JSON.parse(text)) // 앞서 받아온 파일이 json파일이므로 JSON.parse하여 text로 변환
}

.then 은 이전에 return 되었던 값을 매개변수로 전달 받습니다.

.then 안에서 return 해주면 그 다음의 .then 의 매개변수가 됩니다.

이러한 형태가 바로 chaining!!

 

 Promise.all을 사용해 readAllUsersChaining과 정확히 같은 결과를 리턴해라

*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 = () => {
  return Promise.all([
    getDataFromFilePromise(user1Path),  // Promise.all 을 이용하여 한번에 불러온다.
    getDataFromFilePromise(user2Path)   // json의 파일을 객체를 
   ])                                  // [user1, user2]배열로 받아와서 리턴해줬음 !
    .then(([user1, user2]) => {        // 두개의 매개변수를 받는 함수를 작성
      return '[' + user1 + ',' + user2 + ']'; // 다음과같은 형태로 리턴!
    })
    .then(text => JSON.parse(text))
}

 

같은 결과를 리턴합니다. 이번에는 async 및 await 키워드를 사용해서 해결해야 합니다.

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

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

const readAllUsersAsyncAwait = async () => { // async 함수앞에 써주기
  const json = await Promise.all([  // await는 이게 실행될때까지 멈춰라 (동기적)
    getDataFromFilePromise(user1Path), // 일단 파일불러온 뒤 실행해라 !
    getDataFromFilePromise(user2Path)
  ])
  .then(texts => texts.map(text => JSON.parse(text))) 
  return json;
} 

//[user1 , user2]의 배열이 texts의 매개변수로 들어와서
// map 이용해 앞서 불러줬던 texts을 하나씩 불러와서 text에 넣어주고 객체의 파일을 text로 전환해줘야 합니다.