node에서 file system 은 표준 posix 기능에 기반한 api다.
바로가기 : [ what is posix? ]
node의 file system api들은 비동기함수(asynchronous)과 동기(synchronous) 함수 기반으로 되어있다.
const fs = require('fs');
fs.unlink('/tmp/hello', (err) => {
if (err) throw err;
console.log('successfully deleted /tmp/hello');
});
비동기 형식의 api는 해당 함수의 마지막 인자(2번째가 아니라 마지막!) 로 완료를 알리는 callback 함수를 받게 된다.(이하 완료콜백이라 하겠음.)
완료콜백은 api에 따라 약간씩 달라지지만 완료콜백의 첫번째 인자는 error를 알리는 인자가 온다.
만약 해당 api가 정상적으로 기능을 수행했다면 완료콜백의 error자는 null 이나 undifined로 넘어온다. (에러가 없으니까!)
const fs = require('fs');
try {
fs.unlinkSync('/tmp/hello');
console.log('successfully deleted /tmp/hello');
} catch (err) {
// handle the error
}
동기함수는 해당 api의 기능이 즉시 실행되기 때문에 에러처리는 try catch로 잡는다.
fs.rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
console.log('renamed complete');
});
fs.stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`stats: ${JSON.stringify(stats)}`);
});
비동기 함수를 이런식으로 쓰면 당연히 순서는 보장하지 못한다.
위에 코드를 실행하면 어떤게 먼저 행될지 모른다. stat가 실행되고 rename이 실행되면 당연히 err가 완료 콜백에 넘어올것이다.
순서대로 실행하려면 어쩔수 없이 완료 콜백에서 api를 불러야 할것이다.
fs.rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
fs.stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`stats: ${JSON.stringify(stats)}`);
});
});
중첩이 일어난다... 파일작업이 계속해서 이런식으로 진행되면 콜백헬이 일어난다. (promise로 바꿔서 콜백헬을 없에는 방법을 써야할것이다.)
file path
fs에서 path를 받는 방법은 3가지가 있다.
- string
- Buffer
- URL obejct by using file: protocol
1.String
fs.open('/open/some/file.txt', 'r', (err, fd) => {
if (err) throw err;
fs.close(fd, (err) => {
if (err) throw err;
});
});
첫번째 인자에 주면되는데, 절대경로 상대경로 모두 가능하다.
거의 이 방식을 자주 쓰는것 같다.
- Buffer
fs.open(Buffer.from('/open/some/file.txt'), 'r', (err, fd) => {
if (err) throw err;
fs.close(fd, (err) => {
if (err) throw err;
});
});
이 방식은 한번도 써본적이 없긴하다..
- URL Object by using file: protocol
const fs = require('fs');
const fileUrl = new URL('file:///tmp/hello');
fs.readFileSync(fileUrl);
이 방식도 있는데 , 이 방식은 다른 서버에서 파일을 가져올때 사용한적이 있다.
대략적인 사용법을 소개 했는데, 원리는 이정도만 알면 될것이다. 사용하고싶은 api만 문서에서 찾아서 사용하면 될것이다.
'Backend > NODE.JS' 카테고리의 다른 글
[NodeJS] JWT (0) | 2020.03.29 |
---|---|
[NodeJS] Module System (0) | 2019.08.05 |