FileSystem
node.js에서는 fs 모듈
을 통해 파일 시스템에 접근할 수 있다. 현재 파일 기준으로 경로를 잡는것이 아닌 실행하는 node 콘솔 기준으로 경로를 바라본다는 특징이 있다. 파일 시스템에 접근할 때는 반드시 보안에 꼭 신경쓰는 것이 좋다. 또한 비동기 함수이므로 동시에 실행이 보장되지 않는다.
## hello Node.js!
readFile
파일을 읽어오는 메서드이다. 첫 번째 인자에 해당 파일의 상대경로, 두 번째 인자에 콜백 함수를 입력 받는다.
(실행하는 node 기준이므로 같은 디렉토리에 위치해야한다.)
const fs = require('fs');
fs.readFile('./resource/README.md', (err, data) => {
if (err) {
throw err;
}
console.log(data); //<Buffer 23 23 20 68 65 6c 6c 6f 20 4e 6f 64 65 2e 6a 73 21>
console.log(data.toString()); //## hello Node.js!
});
만약 아무런 변환 없이 그대로 출력한다면 버퍼 형태로 출력된다.
따라서 문자로된 실제 파일 데이터를 읽고 싶다면 toString()
메서드로 따로 변환해주어야 한다.
writeFile
반대로 파일을 작성하려면 writeFile
메서드를 사용한다.
생성할 파일 경로(확장자 까지 입력)와 내용을 포함한다.
fs.writeFile('./resource/README2.md', '## Heading2');
기존 내용이 있는 파일에 writeFile
을 해버린다면 아예 덮어씌워지기 때문에 기존 내용뒤에 덧붙이려면 appendFile()
메서드를 사용하면 된다.
fs.appendFile('../resource/README2.md', '### hello Express!');
promises
fs 모듈은 기본적으로 콜백 형태로 사용하기 때문에 복잡한 로직이 들어가게된다면 사용하기가 불편하다.
promises
속성을 통해 프로미스로 감싸지 않고 then 문법을 사용할 수 있다.
const fs = require('fs').promises;
fs.readFile('./resource/README.md')
.then((data) => {
return data.toString();
})
.then((fileData) => {
console.log(fileData);
})
.catch((error) => {
console.error(erroor);
});
동기처리
node.js에서 파일 처리는 비동기 방식으로 처리되는데, sync
접미사를 붙여 동기식으로 처리할 수도 있다.
장점으로는 별도의 추가적인 작업 없이 바로 동기식으로 처리되어 순서가 보장된다.
const fs = require('fs');
let fileData = fs.readFileSync('./README1.md');
console.log(fileData.toString());
fileData = fs.readFileSync('./README2.md');
console.log(fileData.toString());
fileData = fs.readFileSync('./README3.md');
console.log(fileData.toString());
fileData = fs.readFileSync('./README4.md');
console.log(fileData.toString());
단점으로는 요청이 대다수로 들어올 때 성능이 떨어진다는 단점이 있다.
이 문제의 해결 방법으로는 기존 promise
또는 async-await
문법으로 순서를 보장하게끔 해결하는 방법이 있다.
기타 메서드
파일 접근 여부 확인하기
fs.access()
메서드로 파일에 올바르게 접근할 수 있는지 파악할 수 있다.
fs 모듈의 constants
속성으로 경로에 대한 권한, 읽기 및 쓰기 여부를 판단한다.
- F_OK : 존재여부
- W_OK : 쓰기 권한 여부
- R_OK : 읽기 권한 여부
const fs = require('fs').promises;
const constants = require('fs').constants;
fs.access('./assets', constants.F_OK | constants.W_OK | constants.R_OK)
.then(() => {
return Promise.reject('exist folder!');
})
.catch((err) => {
console.log(err.code);
});
//이어서..
디렉토리 생성하기
fs.mkdir('./dir_name');
디렉토리 내용 읽어오기
fs.readdir('../resource').then((dir) => {
console.log('디렉토리 구조', dir); //디렉토리 구조 [ 'README.md', 'README2.md']
});
참고자료
- Node.js 교과서 - 파일 시스템 접근하기 (조현영 저)
- nodejs.dev - The Node.js fs module