Zero To One

node - os, process, path, fs 본문

Backend

node - os, process, path, fs

Zero_To_One 2022. 7. 12. 13:40

1. os 정보 : 다양한 운영체제에서 내 서버가 동작하고 있는 환경에 대한 정보를 얻어올 수 있다.

 

const os = require('os')

console.log(os.totalmem());
console.log(os.freemem());
console.log(os.type());
console.log(os.userInfo());
console.log(os.cpus());
console.log(os.homedir());
console.log(os.hostname());

 

출력 결과

> node app.js
16507834368
10154803200
Linux
{
  uid: 1000,
  gid: 1000,
  username: 'jaehyeok',
  homedir: '/home/jaehyeok',
  shell: '/usr/bin/zsh'
}
[
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 2500,
    times: { user: 266640, nice: 10, sys: 83570, idle: 4815600, irq: 0 }
  },
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 2500,
    times: { user: 262690, nice: 90, sys: 85460, idle: 4784350, irq: 0 }
  },
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 3160,
    times: { user: 265210, nice: 350, sys: 85420, idle: 4818610, irq: 0 }
  },
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 2500,
    times: { user: 264160, nice: 70, sys: 87650, idle: 4811660, irq: 0 }
  },
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 2500,
    times: { user: 265410, nice: 70, sys: 83010, idle: 4820950, irq: 0 }
  },
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 2500,
    times: { user: 274920, nice: 70, sys: 80180, idle: 4812140, irq: 0 }
  },
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 2500,
    times: { user: 260410, nice: 100, sys: 82140, idle: 4824950, irq: 0 }
  },
  {
    model: '11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz',
    speed: 3997,
    times: { user: 263160, nice: 310, sys: 83190, idle: 4814060, irq: 0 }
  }
]
/home/jaehyeok
jaehyeok-Inspiron-15-5510

 

2. process : node가 동작하고 있는 프로세스에 대한 정보를 가져올 수 있다.

 

const process = require('process')

console.log(process.execPath); //현재 실행되고 있는 노드의 위치
console.log(process.version); //노드의 버전
console.log(process.pid); //프로세스 ID
console.log(process.ppid); //프로세스 부모의 ID
console.log(process.platform); //플랫폼에 대한 정보
console.log(process.env); //현재 컴퓨터에 저장된 환경변수
console.log(process.uptime()); //얼마나 실행되고 있었는지
console.log(process.cwd()); //현재 실행하고 있는 노드의 경로
console.log(process.cpuUsage()); //CPU 사용량

 

3. path : 파일의 경로에 대해 접근하거나 경로에 대해 무언가를 처리해야할 때 사용한다.

 

const path = require('path');

//os마다 표현되는 경로가 다르다
//path를 이용해서 운영체제별로 경로표기법이 달라져도 잘 동작할 수 있도록 만들어야 한다.

console.log(__dirname);
console.log(__filename);

console.log(path.sep); //경로 구분자
console.log(path.delimiter); //환경변수 구분자

//basename
console.log(path.basename(__filename)); //파일정보만 보여줌, app.js
console.log(path.basename(__filename, '.js')); //.js 확장자 제거, app

//dirname
console.log(path.dirname(__filename)); //디렉토리 이름만 가져올때, /home/jaehyeok/node-study/8.path

//ectension
console.log(path.extname(__filename)); //확장자만 출력, .js

//전체경로를 하나씩 분리할 수 있다. (objct 형태)
//parse, 
const parsed = path.parse(__filename);
console.log(parsed);

// {
//     root: '/',
//     dir: '/home/jaehyeok/node-study/8.path',
//     base: 'app.js',
//     ext: '.js',
//     name: 'app'
//  }

//parse를 string형태로 나타내기
const str = path.format(parsed);
console.log(str);


// isAbsolute (절대경로인지 상대경로인지 알아보기)
console.log('isAbsolute?', path.isAbsolute(__dirname)); //isAbsolute? true
console.log('isAbsolute?', path.isAbsolute('../')); //isAbsolute? false

// normalize (잘못된 경로를 알아서 수정해줌 )
console.log(path.normalize('./jaehyeok//////study')); //jaehyeok/study

// join
console.log(__dirname + '/' + 'image'); //os별로 경로가 상이하기때문에 좋은 방법은 아님 (worst)

console.log(__dirname + path.sep + 'image'); //path.sep를 이용하여 각 os별로 구분자를 넣어줄 수 있음 (good)

console.log(path.join(__dirname, 'image')); //path.join을 이용하여 경로를 만듬 (best)

 

4. fs : 파일을 읽기,쓰기,이름변경 등을 할 수 있는 file모듈

  - api를 사용할 때, 인자는 어떤 것들이 있는지, 추가적으로 전달해야하는 옵션과 같은 인지가 있는지

  - 함수에서 return되는 값은 무엇인지

  - promises라면 catch를 이용하여 error를 잡기

const fs = require('fs');

// 3가지 형태의 api
// 1. rename(...., callback(error, data)) //비동기
// 2. try { renameSync(....) } catch(error) { } //동기
// 3. promises.rename().then().catch(0)

// fs.renameSync('./file1.txt', './file-new.txt') -> 오류발생되면 다음것이 실행이 안됨 
// 에러가 발생될 수 있는 것은 try catch 이용
try{
    fs.renameSync('./text.txt', './file-new.txt') 
} catch (error){
    console.error(error)
}

fs.rename('./file-new.txt', './mytext.txt', (error) => { //callback함수로 전달
    console.log(error);
})
console.log('hello')

fs.promises
    .rename('./mytext.txt', './mytext-new.txt')
    .then(() => console.log('Finish!')) //없어도 됨
    .catch(console.error)
const path = require('path');

//fs(filesystem)이란 변수는 fs모듈안에 있는 promises들을 가리킨다
const fs = require('fs').promises; 

// read a file
fs.readFile('./mytext-new.txt')
    .then(data => console.log(data)) // <Buffer 68 65 6c 6c 6f 21> 버퍼형태로 읽어옴
    .catch(console.error)

fs.readFile('./mytext-new.txt','utf-8')
    .then(data => console.log(data)) // hello!
    .catch(console.error)

// write a file
fs.writeFile('./mytext-new.txt', 'hello word!')
    .catch(console.error);

// append a file
fs.appendFile('./mytext-new.txt', path.dirname(__filename))
    .catch(console.error);

// copy a file
fs.copyFile('./mytext-new.txt', './file.txt') //비어있음
    .catch(console.error);

//파일을 추가한 다음에 copy
// Why? 코드를 순서대로 작성했지만 promises이므로 비동기적으로 처리되기 때문에 순서가 보장되지 않는다
// 순서가 중요할 경우, 해당되는 promises가 수행된 다음 then안에서 처리해주어야함
fs.appendFile('./mytext-new.txt', path.dirname(__filename))
.then(()=> {
    fs.copyFile('./mytext-new.txt', './file2.txt')
    .catch(console.error);
})
    .catch(console.error);


// folder
fs.mkdir('sub-folder')
    .catch(console.error)

fs.readdir('./')
    .then(console.log)
    .catch(console.error);

'Backend' 카테고리의 다른 글

MVC 패턴  (0) 2022.07.25
디버깅  (0) 2022.07.13
node -buffer, stream  (0) 2022.07.12