-
NodeJS File async와 asynchronous 그리고 promise개발언어/Node.js 2022. 7. 28. 15:12
File
NodeJS에서 file을 읽고 쓰고, 이름을 변경하고 등등의 일을 할 수 있는 모듈이다. 'fs' 모듈의 공식문서(명세)를 읽어보면, 사용할 수 있는 함수에 대해서 알아 볼 수 있다.
그리고 Dir에 관련된 class에는 어떤 내용이 있는지 FSWatcher 인터페이스에는 어떤 내용이 있는지 등등 'fs'모듈에 대한 모든 자세한 정보를 알 수 있다.
결론적으로 'fs'안에도 다양한 class들이 포함되어 있다는 것을 알 수 있다. 또한 'fs'모듈은 file안에서 기본적으로 할 수 있는 모든 동작들 제공해준다.
💫유의 사항
모든 API는 3가지 형태로 제공이되어 진다.
1.rename(.....,callback(error,data))
rename이라는 형태로 제공이 되고 rename()이라는 형태 그대로 쓰면, 비동기이다. 필요한 인자들을 전달하고, 마지막으로 callback함수를 전달해 주면 NodeJS에서 필요한 일들을 다한 다음에 등록한 callback함수를 호출해준다.
보통 callback 함수는 error와 data 두가지 인자를 가지고, error가 발생했는지 성공해서 data를 받아 왔는지
2.renameSync(.......)
renameSync를 하게되면 blocking이다. 즉 따로 callback 함수를 전달하지 않는다. 대신에 이것이 잘 못 되면 error가 발생한다. 그리고 이것이 끝날때 까지 다음 줄로 넘어 가지 않는다.
try{ renameSync(....) }catch(e){ trow }
따로 error가 발생한 사항을 전달해주지 않는다. NodeJS 어플리케이션의 작동이 멈추게 하면 안되므로 항상
try{}catch(e){}으로 감싸줘야한다.
3.promises.rename().then().catch(0)
promise안에 있는 rename을 이용하게 되면, Promise 형태로 사용할 수 있다.
fs.renameSync() 동기적 방법
try { fs.renameSync("./file.txt", "./file-new.txt"); } catch (error) { console.error(error); } console.log('hello');
error 출력 결과=>
정상 출력 결과 =>
첫번째 인자로 oldPath(이전 경로) 두번째 인자로(새로운 경로)를 전달해 주면 되고, 해당 메서드는 아무 값도 return하지 않는다.
만약 존재하지 않는 file이름을 변경하려고하면 error가 발생할 수 있다. => 코드가 죽는다고 할 수 있는데 코드가 죽었다는 것의 의미는 다음줄의 코드가 실행되지 않고, 어플리케이션의 동작이 error가 발생한 코드 줄 에서 멈추는 것이다.
이렇게 error가 발생해서 어플리케이션의 동작을 정지 시킬 수 있는 여지가 있는 코드는 try~catch문으로 감싸주어야 한다.
🔔error가 발생한다면 어떻게 처리할지 catch문 안에서 처리할 수 있다.
위 처럼 fs.renameSync()를 이용할 때는 try~catch문을 사용해야하고, 동기적으로 사용이 되어 해당 함수가 끝날때까지 대기 상태에 놓여 다음 코드를 실행할 수 없음으로 가급적이면 사용하지 않는것이 바람직하다.
fs.rename() 비동기적 방법
fs.rename("./text-new.txt", "./text.txt",(error)=>{ console.log(error); }); console.log('hello');
출력 결과 =>
비동기적 이기때문에 fs의 명세의 보면 rename() 메서드는 비동기적 이기 때문에 callback함수를 전달 해주어야 하고, error가 발생할 때 어떤 exception을 실행해야 하는지만 인자로 전달해 주면 된다.
출력 결과를 보면 밑의 console.log("hello")를 출력하는 것을 먼저 실행하고 file이름이 rename되고 나면, 그 다음에 callback을로 받은 rename()메서드의 error 발생 여부를 출력해주는 것을 확인할 수 있다.
파일이름은 다시 text로 변 한 것을 확인 할 수 있다.
fs.promise.rename()
fs.promises.rename("./text.txt", "./text-new.txt") .then(()=> console.log("Done")) .catch(console.error);
rename에 대해서 잘 실행이되면, 아무런 값도 전달해 주지 않으므로, then()에서는 console.log()를 이용해서 정상작동 했음을 알리는 원하는 메세지를 출력하면 되고, 또는 아예 아무 것도 처리 해주지 않아도 된다.
error를 처리하고 싶다면, .catch()를 사용해서 console.errer()를 이용해 error를 출력해 줄 수 있다.
🔔JavaScript 문법
//다음 코드를 ... .catch((error)=> console.error(error)); //다음과 같이 축약해서 작성 할 수 있다. ... .catch(console.error);
함수의 인자와 함수안에서 실행될 인자에 들어갈 인자가 같은 경우
const fs = require("fs"); //3 //rename(....,callback(error,data)) //try{ renameSync(....)}catch(e){ } //promise.rename().then.catch(0) try { fs.renameSync("./text.txt", "./text-new.txt"); } catch (error) { console.error(error); } fs.rename("./text-new.txt", "./text.txt", (error) => { console.log(error); }); console.log("hello"); fs.promises .rename("./text2.txt", "./text-new.txt") .then(() => console.log("Done!!")) .catch(console.error);
fs.rename()메서드와 fs.promises.then().catch()가 모두 비동기 방식이기 때문에 무엇이 먼저 실행 될지 알 수 없음으로 text2.txt 파일을 만든다.
=> 코드 실행후 출력 결과
=> 코드 실행후 file이름
'개발언어 > Node.js' 카테고리의 다른 글
NodeJS Buffer and Stream outline (0) 2022.08.02 NodeJS File의 다양한 사용법 (0) 2022.08.02 NodeJS Path 그리고 유의할 점 (0) 2022.07.27 NodeJS Timer와 Call Stack의 연관 (0) 2022.07.09 NodeJS Process 정보 (0) 2022.07.09