본문 바로가기

개념/javaScript

[javaScript] fs모듈, fs.readFile

Node.js 내장모듈 살펴보기

node.js의 내장 모듈 목록


Node.js에서 파일 시스템 모듈 불러오기

fs모듈은  빌트인 모듈(built-in module)이므로, js파일에 require만 시켜주면 된다. 

빌트인 모듈(built-in module)이란?
해당 프로그래밍 언어에서(이 경우는 Node.js에서) 공식적으로 제공하여 별도의 다운로드없이 사용가능한 모듈이다.
const fs = require('fs'); // 파일 시스템 모듈을 불러옵니다

3rd-party 모듈 사용하기

3rd-party모듈이란?
해당 프로그래밍 언어에서(이 경우는 node.js에서) 공식적으로 제공하는 빌트인 모듈(built-in module)이 아닌
모든 외부 모듈을 말한다.
npm install underscore

그리고 js파일에 다음과 같이 require 시켜준다.

const _ = require('underscore');

fs모듈로 파일 내용 읽기

 

fs.readFile(path[, options], callback)
  • 콜백의 첫번째 인자는 error,두번째 인자는 data이다.
  • 에러가 발생하지 않으면 err 는 null 이 되며, data 에 문자열이나 Buffer 라는 객체가 전달된다.
  •  data 는 파일의 내용이며 기본적으로 Buffer 라는 객체가 전달된다.

 

option을 문자로 넣는 경우 (인코딩 인자로 받음)

fs.readFile('test.txt', 'utf8', (err, data) => {
  if (err) {
    throw err; // 에러를 던집니다.
  }
  console.log(data);
});

 

option을 객체로 넣는 경우

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

// /etc/passwd 파일을 options를 사용하여 읽습니다.
fs.readFile('/etc/passwd', options, (err, data) => {
  if (err) {
    throw err; // 에러를 던집니다.
  }
  console.log(data);
})

🛑인코딩 옵션을 추가하지 않으면 Buffer data가 전달된다. 우리가 원하는 데이터의 형식을 얻으려면 반드시 utf-8을 적어줘야한다.

buffer란 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역을 말한다.

[, options]가 써도되고 안써줘도 된다고는 하지만, 대부분의 경우 'utf-8'을 적는다.

 

Node.js fs.readFile 공식문서


callback 활용하기

const fs = require("fs");

const getDataFromFile = function (filePath, callback) {
  return fs.readFile(filePath,'utf-8',(err,data)=>{
    if(err) {callback(err,null)}
    else{callback(null,data)}
  })
};

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

promise then 활용하기

const fs = require("fs");

const getDataFromFilePromise = filePath => {
  return new Promise((resolve,reject)=>{
      fs.readFile(filePath,'utf-8',(err,data)=>{
        if(err){
          reject(err)
        }
        resolve(data)
      })
    }
  )
};

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

promise  all 활용하기

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), getDataFromFilePromise(user2Path)])
    .then((datas)=>{
      return [JSON.parse(datas[0]),JSON.parse(datas[1])]
    })
}

readAllUsers()

 

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 () => {
  const user1 = JSON.parse(await getDataFromFilePromise(user1Path))
  const user2 = JSON.parse(await getDataFromFilePromise(user2Path))
  return [user1,user2]
}

readAllUsersAsyncAwait();

💡 관련 링크