javaScript/nodeJs

노드js 내장모듈// fs 파일관리 시스템 -1

부엉이사장 2022. 6. 23. 11:34

fs모듈은 두파트로 나눴다. 어차피 웹개발할때 많이 쓸 모듈이고 동기,비동기개념도 들어있어서..

 

 

1. 사용하기~

 

암튼 사용법은 간단한다.

const fs = require('fs')

모듈을 가져왔다.

 

fs.readFile('./readme.txt', (err,data)=>{
    if (err){
        throw err;
    }else {
        console.log(data.toString().split('\r\n'))
    }
})

fs모듈에서 readFile메서드를 가져오는데 여기에는 두가지 파라미터가 들어간다.

하나는 파일경로, 현재 노드 실행하는 경로기준 상대경로를 넣어줬다.

그다음은 콜백을 넣어줬는데 에러처리를 위한 err와 data를 넣었다.

 

만약 err면 던져버리고 아니라면 err는 null이고 정상적으로 data를 가져왔으니 

데이터를 가져왔다. 

이건 버퍼? 머시기로 읽을수 없는 코드니까 toString()으로 읽을수 있게 했다. 

toString()메서드 없이 출력하면 

요렇게 떠버린다

 

암튼 readme txt내용은

이렇다.

출력해보면(split없이)

노드에서 잘 가져왔구만~

 

코드를 보면 나는 split으로 어레이에 넣어줬는데

언터때문에 \r, \n이 같이 들어오길래 저거기준으로 잘라서 어레이에 담아줬다.

이렇게 어레이에 담겨서 이쁘게 나온다

 

 

 

2. 콜백말고 프로미스로 넘겨주기

const fs = require('fs').promises;

fs.readFile('./readme.txt')
    .then((data)=>{
        console.log(data.toString())
        return data.toString().split('\r\n')
    })
    .then((data)=>{
        console.log('두번째', data[0])
    })
    .catch((err)=>{
        console.error(err)
    })

여기서 중요한건 모듈 불러올때 .promises를 붙여준다.

이 모듈을 프로미스로 쓸 수 있게 해주는건데 안붙이고 프로미스를 쓰거나

붙이고 콜백을 쓰면 에러떠서 안된다. (정확히 콜백부를때는 에러는 안뜨고 실행안됨. 프로미스는 에러뜸)

 

만약 둘다 섞어쓰고 싶으면 

const fs = require('fs')
const fss = require('fs').promises;

이렇게 둘다 불러와서 짬뽕해야될듯.

 

암튼 프로미스 코드 예제로

 

const fs = require('fs').promises;

fs.readFile('./readme.txt')
    .then((data)=>{
        console.log(data.toString())
        return data.toString().split('\r\n')
    })
    .then((data)=>{
        console.log('두번째', data[0])
    })
    .catch((err)=>{
        console.error(err)
    })
먼저 data를 가져와서 콘솔로 보여주고
첫번째 then에서 이걸 어레이로 담아서 보내줬다.
두번째 then에서는 첫번째 then에서 가져온 어레이를 인덱스0번째만 출력해봤다
 

 

 

++잡설

const promise = new Promise((res, rej)=>{
    if (0){
        rej(new Error('바보'))
    }else {
        res('하잉')
    }
})
.then(data=>{
    console.log(data+'하잉')
})
.catch(
    console.log
)
일반적인 프로미스는 res, rej를 전해주는데 저기선 그냥 return으로 걍 넘겨줌.. 
then여러개면 에러처리는 잘되려나?
 
 
암튼 다시 fs시스템으로 넘어가서

파일쓰기다.

const fs =require('fs').promises;

fs.writeFile('./readme2.txt','읽어줘 리드미2')
.then(()=>{
    return fs.readFile('./readme2.txt')
})
.then((data)=>{
    console.log(data.toString())
})
.catch(err=>{
    console.err(err)
})

fs.writeFile메서드에 두가지 파라미터

첫번째는 경로 및 제목, 두번째는 내용을 적으면 된다.

 

 

 

 

2. 비동기적인 fs시스템

const fs = require('fs');

먼저 이건 콜백으로 볼거다.

fs.readFile('./readme2.txt',(err,data)=>{
    if(err){
        throw err;
    }else{
        console.log('n번', data.toString());
    }
});

이렇게 fs파일을 읽는 코드를 세번 써볼거다.

 

fs.readFile('./readme2.txt',(err,data)=>{
    if(err){
        throw err;
    }else{
        console.log('1번', data.toString());
    }
});

fs.readFile('./readme2.txt',(err,data)=>{
    if(err){
        throw err;
    }else{
        console.log('2번', data.toString());
    }
});

fs.readFile('./readme2.txt',(err,data)=>{
    if(err){
        throw err;
    }else{
        console.log('3번', data.toString());
    }
});

이걸 실행시키면

실행할때마다 순서가 뒤죽박죽 암거나 출력한다

비동기적으로 실행되서 그렇다.

 

사실 이 방법이 좋은게 만약 수많은 요청을 프론트에서 받아서 백단으로 넘어와서 처리할때

비동기적으로 처리하게되니까 서버가 좀더 안정적이된다.

누가 100개물건산다고 하면 다음손님이 앞손님 100개물건 처리할떄까지 안기다려도되는거다.

 

암튼 만약 이걸 순서대로 하고싶으면 

 

 

#2-1 콜백지옥속으로

fs.readFile('./readme2.txt',(err,data)=>{
    if(err){
        throw err;
    }else{
        console.log('1번', data.toString());
        fs.readFile('./readme2.txt',(err,data)=>{
            if(err){
                throw err;
            }else{
                console.log('2번', data.toString());
                fs.readFile('./readme2.txt',(err,data)=>{
                    if(err){
                        throw err;
                    }else{
                        console.log('3번', data.toString());
                    }
                });
            }
        });        
    }
});

이렇게 콜백으로 else안에 코드넣으면서 하면된다. 바로 유명한 콜백지옥 ㅋㅋ

 

#2-2 프로미스로~

const fs = require('fs').promises;

console.log('gogo')
fs.readFile('./readme2.txt')
.then((data)=>{
    console.log('1번', data.toString())
    return fs.readFile('./readme2.txt')
})
.then((data)=>{
    console.log('2번', data.toString());
    return fs.readFile('./readme2.txt');
})
.then((data)=>{
    console.log('3번', data.toString());
    console.log('end')
})
.catch((err)=>{
    console.error(err);
})

이렇게 프로미스로 만들어도된다~ 자세한건 위에서 다 설명한거니 생략

 

 

#2-3 async, await 으로~

async function main(){
    let data = await fs.readFile('./readme2.txt');
    console.log('1번', data.toString());
    data = await fs.readFile('./readme2.txt');
    console.log('2번', data.toString());
    data = await fs.readFile('./readme2.txt');
    console.log('3번', data.toString());
    data = await fs.readFile('./readme2.txt');
    console.log('4번', data.toString());
}
main()

 

##############################################