menu

NodeJS 기초14

Node JS의 내장 모듈4

  • fs(File System 모듈)
    브라우저상에서 돌아가는 자바스크립트와는 다르게 Node는 직접 OS상의 File System 접근이 가능하다.

     const fs = require('fs'); 
    
     // 파일 쓰기 
     fs.writeFile('./test.txt, '문자입력' (err,data) => {
       if(err) {
         console.error(err)
       }
     });
    
     // 파일 읽기
     fs.readFile('./test.txt', (err, data) => {
         if(err) {
             console.error(err)
         }
         console.log(data.toString());
         // toString()을 안해주면 버퍼가 출력된다. 
     })
    
  • util(유틸 모듈)
    util 모듈은 Node Js의 API를 지원하도록 준비된 내장 모듈이다.
    유용한 함수가 여럿 준비되어 있다.

     const util = require('util');
     const crpyto = require('cryto');
      
     const dontusenme = util.deprecate((x, y) => {
       console.log(x + y)
     }, '이 함수는 2018년 12월 까지만 지원합니다' );
    
     dontusenme(1, 2);
     // 결과 
     // 3
     // DeprecationWarning: 이 함수는 2018년 12월 까지만 지원합니다.
        
     // 해당 함수는 API를 만들때 쓰일만한 함수이다 참고~
     
     const randomBytesPromise = util.promisefy(crypto.randomBytes);
     const pdkdf2Promise = util.promisefy(crypto.pbkdf2);
        
     randomBytesPromise(64)
       .then((buf) => {
         const salt = buf.toString('base64')
         return pdkdf2Promise('패스워드', salt, 651395, 64, 'sha512')
       })
       .then((key) => {
         console.log(Key.toString('base64'))
       })
       .catch((err) => {
         console.error(err)
       })
    
       (async () => {
           const buf = await randomBytesPromise(64);
           const salt = buf.toString('base64');
           const key = pdkd2Promise('패스워드', salt, 651395, 64, 'sha512')
       })
    
  • fs모듈

    const fs = require('fs');
    
    // 파일 쓰기
    const writeStream = fs.createWriteStream('./text.txt');
    // 파일 wirteStram을 준비한다.
    
    writeStream.on('finish', () => {
      // 파일쓰기가 끝나면(finish) 발생하는 이벤트
      console.log('파일 쓰기 완료')
    })
    
    writeStream.write('테스트입니다.')
    writeStream.write('테스트입니다2.')
    writeStream.end(); 
    // 스트림을 닫는다.
    
    // 파일 읽기
    const readStream = fs.createReadStream('./text.txt', {highWaterMark : 16}); 
    // highWaterMark는 바이트 숫자를 지정
    
    const data = [];
    // 배열을 준비
    readStream.on('data', (chunk) => {
        //데이터를 읽을(스트림 리드)할 때 발생하는 이벤트(data)
        data.push(chunk)
        //배열에 청크(버퍼)를 담는다
        console.log(chunk, cunkh.length)
        //버퍼와 버퍼의 크기를 출력한다
    })
    
    readStream.on('end', () => {
      // 데이터를 다 읽으면 발생하는 이벤트(end)
      console.log('end', Buffer.concat(data).toString());
    })
    
    readStream.on('error', (err) => {
      // 데이터를 청크를 읽는 도중 혹은 무언가 에러가 발생하였을 경우 발생하는 이벤트
      console.log(err)
    })
    
    
    //파일 복사 
    //스트림을 연결해서 넣어준다.
    const fs = require(fs);
    
    const readStream  = fs.createReadStream('readme.txt');
    const writeStream = fs.createWriteStream('write.txt');
    readStream.pipe(writeStream);
    // 스트림을 이어준다.
    // stream은 연속적으로 파이핑을 해줄수 있다.
    // pipe.pipe식으로...
    
    //파일 복사2
    const readStream = fs.copyFile('./readme2.txt, './write2.txt', (err) => {
      console.log(err)
      //위와 동일한 방식이다.(스트림을 파이핑(이어주는)하는방식)
    });
    

노드에서는 이벤트는 기본적으로 이벤트리스너를 통해서 만들어진다.
하지만 노드에서 미리 만들어놓은 이벤트 뿐만이 아니라 개발자가 스스로 이벤트가 발생할시 대응하는 이벤트리스너를 만들 줄도 알아야 한다.

eventListener

// Event 등록하기 

const EventEmitter = require('events');
// Event module 로드 한다.
const myEvent = new EventEmitter();
// 새롭게 이벤트를 만든다. 

myEvent.addListener('발생!', () => {
    console.log('이벤트 발생')
});

myEvent.on('요청', () => {
    console.log('응답')
    // 계속 반복되는 이벤트를 등록하는 함수이다.
    // 요청시 응답 한다던가...?
    // addListener랑 동일한 개념이다.
});

myEvent.once('init', () => {
    console.log('초기화 되었습니다.')
    // 한번만 실행할 이벤트를 등록한다
    // init 이라던가 destroy 라던가..?
});


// 이벤트 호출하기 

myEvent.emit('요청')
// 커스텀 이벤트를 호출한다.
myEvent.emit('init')
// 커스텀 이벤트를 호출한다.


// 이벤트 확인하기 

myEvent.listenerCount('요청')
// '요청' 이라는 이벤트로 몇개가 등록되어있는지 확인한다.


// 이벤트 제거 하기 

myEvent.removeListener('init')
// 'init' EventListener를 지운다.


// 이벤트 한번에 지우기 

MyEvent.removeAllListener('요청')
// '요청' 이라는 이벤트를 다 지운다.