[ 06.23 ] fs.readFile()

이숙영·2021년 6월 23일
0

Node.js

목록 보기
1/5
post-thumbnail

Achievement Goals

Node.js의 fs 모듈의 사용법을 이해할 수 있다.

*Node.js는 "비동기 이벤트 기반 자바스크립트 런타임이다.
싱글(단일)스레드 : 한번에 노드제이에스가 실행하 수 있는 파일은 한개임.

1. fs 모듈이란?

fs(File System) 의 약자로, fs모듈을 설치하면 PC의 파일을 읽거나 저장하는 등의 일을 할 수 있게 도와준다.
node.js 에는 컴퓨터의 계산기 기능, 메모장 기능 처럼 기본적으로 세팅되어있는 내장 모듈이 있다.

자바스크립트파일을 불러오기 위해 밑에 작성된 키워드를 작성한것처럼

<script src = '파일명'/> 

node.js 에서는 내장모듈을 불러오기 위해 require 를 사용한다.

const fs = require('fs'); // 파일 시스템 모듈 불러오기
const dns = require('dns'); // DNS 모듈을 불러오기

마치 리액트에서 import 하여 파일을 불러오는것과 같다고 볼 수 있다.
그렇다면 node.js 에서도 리액트처럼 외부 모듈을 설치할 수 있을까?
물론 그렇다!
내장된 모듈이 아닌, 제 3의 모듈을 설치 하기 위해서는 다음과 같은 코드를 작성한다.

npm install underscore  //설치 후 
const _ = require('underscore'); //require 로 불러와 사용.

2. fs.readFile

fs.readFile() 은 로컬에 존재하는 파일을 읽어오는 메소드다.
fs.readFile 은 비동기적으로 파일 내용 전체를 읽으며 세가지의 인자를 넘길 수 있다.

형태

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

(1) path

첫번째 인자에 오는 path 는 파일 이름을 넘겨주는 인자로서,

<string> || <Buffer> || <URL> || <integer> 

총 위의 네가지의 타입이 올 수 있는데, 보통은 문자열타입이 온다고 보면 된다.

(2) options

공식문서조차 [,options] 라고 써있는 options 는 말그대로 옵셔널 하다.

<Object> | <string>

온다면 위의 두 타입이 올 수 있는데 만약 스트링 타입으로 오게 된다면
인코딩을 넘기게 되는데, 그동안 우리가 많이 봤던 'utf8' 이 알고보니 문자열.. 뭐 관련있나봄 (내공이 부족하여,, 여기까지 ㅏ하하하)
utf-8 은 한국어라나 뭐라나 영어,일본어 등등은 따로 코드가 있다고 한다.
하지만 optional 한 options 인자자리에 'utf8' 를 써주지 않는다면 비동기 함수의 인자에 toString() 처리를 해주어야 한다.

(3) callback()

함수를 인자로 받는 callback() 은

err  <Error>
data <string> | <Buffer>

err, data 를 인자로 받는데 콜백으로 받은 함수에서 파일을 읽고, 파일을 비동기적으로 실행한다.

위 세가지를 종합해보면 다음과 같은 형태를 띈다.

fs.readFile('test.txt', 'utf8', (err, data) => {
  if (err) {
    throw err; 
  }
  console.log(data);
});

3. 왜 사용할까?

이런저런 설명 다 됐고, 한마디로 간단히 말하면 빠르게! 사용하기 위해서이다.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

프로그램의 진행 상황을 간단하게 설명하자면,
각 a,b,c 라는 함수가 있다고 치자.
각기 실행시간이 다른 이 함수들을 비동기적으로 처리하고, 관리하는 메소드로
callback / promise(resolve,reject) / async,await
세가지가 있다고 앞서 설명했다.

이 방법들을 사용하기전, 비동기적 파일을 읽도록 도와주는 친구가 바로 이 fs.readFile 이다.
노드의 fs 모듈친구의 도움을 받아 비동기는 더 빨리 끝날 수 있는것이다.

const getDataFromFile = function (filePath, callback) {
  //파일을 읽어와야 한다. 
  fs.readFile(filePath,'utf8',(err,data) => {
    //utf8 로 변환한다. 없으면 data는 toString() 작성.
    if(err){
      callback(err,null)
    }else{
      callback(null,data) // or (null,data.toString();)
    }
  });
};

갓잇?
여기서의 에러는 리드파일에서 생성되는 에러이고, 에러가 생성되면(트루가 되면) 에러가 생성된다. 주의할점은, 위의 코드처럼 인자 callback를 불러오고, callback 은 err,data 인자가 두개이기 때문에 어디서 에러처리를 해주고 어디서 데이터 처리를 해줄지 명확하게 표시를 해야한다. 그래서
err => callback(err,null)
data => callback(null,data)
그냥 비어있는 상태의 null 처리를 반드시 해주도록 한다!

🤔 "" 빈문자열이나 undefined 를 쓰면안되나유?
빈문자열이나 undefined 또한 한자리 차지하고있는? 애들이기때문에 callback 인자로서 제대로 된 역할을 하지 못할것이다.

profile
FrontEndDeveloper

0개의 댓글