util 모듈 ( promisify, depricated )
// util 모듈
const util = require('util');
const crypto = require('crypto');
// deprecated method임을 알려 줄 때 사용
const dont_use_me = util.deprecate((x,y)=>{
console.log(x+y);
},'이 함수는 이제 안 쓸거에요~');
dont_use_me(1,2); // DeprecationWarning이 출력됨
// callback -> promise
const randomBytesPromise = util.promisify(crypto.randomBytes);
const pbkdf2Promise = util.promisify(crypto.pbkdf2);
// crypto promise로 바꾼 코드 ( 장점 : 최신 문법 async)
randomBytesPromise(64)
.then((buf)=> {
const salt = buf.toString('base64');
return pbkdf2Promise(('비밀번호 값', salt, 101395, 64, 'sha512'));
})
.then((key) => {
console.log('password : ',key.toString('base64'));
})
.catch(err=>{
console.log(err);
});
// async로 바꿔줌!
async( () => {
const buf = await randomBytesPromise(64);
const salt = buf.toString('base64');
const key = pbkdf2Promise(('비밀번호 값', salt, 101395, 64, 'sha512'));
console.log('password : ',key.toString('base64'));
})
events 모듈
const EventEmitter = require('events');
const myEvent = new EventEmitter();
myEvent.addListener('방문', () => {
console.log('하이하이');
});
const callback = () => {
console.log('hi');
};
myEvent.addListener('방문',callback);
myEvent.on('종료',() => {
console.log('빠이빠이');
});
// 한 번만 실행 됨
myEvent.once('특별이벤트', () => {
console.log('한 번만 실행 됨');
});
myEvent.emit('방문'); // 이벤트 호출하기
myEvent.emit('종료');
myEvent.removeAllListeners('종료'); // 전체 제거
myEvent.removeListener('방문',callback); // 제거
myEvent.listenerCount('방문'); // 개수
fs 모듈 ( 동기와 비동기 )
// 파일 시스템 ( fs모듈 - 동기와 비동기 )
const fs = require('fs');
fs.readFile('./readme.txt', (err,data) => {
console.log(data); // buffer
console.log(data.toString());
});
fs.writeFile('./writeme.txt','글을 써주세요.', (err) => {
fs.readFile('./writeme.txt',(err,data)=>{
console.log(data.toString());
})
});
// readFile 1,2,3 순차 실행 하는 방법 ( 1.콜백헬 / 2. 동기method 사용)
// 코드는 깔끔해 보이지만, blocking
let data = fs.readFileSync('./readme.txt');
let data2 = fs.readFileSync('./readme.txt');
// fs 기타 메소드fs.access('./folder',fs.constants.F_OK | fs.constants.R_OK, err => { if(err && err.code === 'ENOENT'){ fs.mkdir('./folder', err => { fs.open('./folder/file.js', (err,fd) =>{ fs.rename('old','new-name',err=>{ console.log('이름 바꾸기!'); }) }) }) }});
fs.readdir('./folder', dir =>{ fs.unlink('./folder/newFile.js', err => { fs.rmdir('./folder', err => { console.log('폴더지우기 성공'); }) })});
// fs callback 헬 해결 ( node version 10.0 이상)const fs = require('fs').promises;
// fs 기타 메소드
fs.access('./folder',fs.constants.F_OK | fs.constants.R_OK, err => {
if(err && err.code === 'ENOENT'){
fs.mkdir('./folder', err => {
fs.open('./folder/file.js', (err,fd) =>{
fs.rename('old','new-name',err=>{
console.log('이름 바꾸기!');
})
})
})
}
});
fs.readdir('./folder', dir =>{
fs.unlink('./folder/newFile.js', err => {
fs.rmdir('./folder', err => {
console.log('폴더지우기 성공');
})
})
});
// fs callback 헬 해결 ( node version 10.0 이상)
const fs = require('fs').promises;
버퍼와 스트림
// Buffer 와 Streaming
const fs = require('fs');
const readStream = fs.createReadStream('./readme.txt',{ highWaterMark: 16}); //16bytes씩 읽기
const data = [];
readStream.on('data', chunk => {
data.push(chunk);
console.log('data',chunk,chunk.length);
});
readStream.on('end', () => {
console.log('end',Buffer.concat(data).toString());
});
readStream.on('error',(err) => {
console.log(err)
});
const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.write('write sth');writeStream.write('write more');writeStream.end();
// 복사 방법 1readStream.pipe(writeStream);// 복사 방법 2fs.copyFile('./readme.txt','./writeme.txt',(err)=>{
});
const zlib = require('./zlib'); // 파일 압축 모듈const zlibStream = zlib.createGzip();readStream.pipe(zlibStream).pipe(writeStream); // 압축하여 복사하기
const writeStream = fs.createWriteStream('./writeme2.txt');
writeStream.write('write sth');
writeStream.write('write more');
writeStream.end();
// 복사 방법 1
readStream.pipe(writeStream);
// 복사 방법 2
fs.copyFile('./readme.txt','./writeme.txt',(err)=>{
});
const zlib = require('./zlib'); // 파일 압축 모듈
const zlibStream = zlib.createGzip();
readStream.pipe(zlibStream).pipe(writeStream); // 압축하여 복사하기
crypto
// crypto
const crypto = require('crypto');
// sha512로 암호화하여 base64로 출력하라 ( 복호화 불가 => 비밀번호를 다시 복호화할 필요없음)
crypto.createHash('sha512').update('비밀번호 값').digest('base64');
// pbk 알고리즘 ( 다른 값인데 같은 hash가 생성될 수 있는 문제를 보완)
crypto.randomBytes(64, (err,buf) => {
const salt = buf.toString('base64'); // buffer -> 문자열
console.time('암호화');
/**
* pbkdf2 방식
* @param salt : 실행할 때마다 salt값이 다름 ( 해킹하기 훨씬 어려워짐 )
* @param 101395 : 1초 정도 될떄 까지 101395값을 바꿈 보통
*/
crypto.pbkdf2('비밀번호 값', salt, 101395, 64, 'sha512', (err,key) => {
console.log('password : ',key.toString('base64'));
console.timeEnd('암호화');
})
});
// 실무에선 이걸 더 많이 씀 : bcrypt
// crypto 양방향 암호화
const crypto = require('crypto');
const cipher = crypto.createCipher('aes-256-cbc','열쇠');
let result = cipher.update('비밀번호','utf8','base64');
result += cipher.final('base64');
console.log('암호',result);
// 복호화 ( 열쇠가 노출되면 안 됨 => 열쇠값이 틀리면 bad decrypt error 발생 )
const decipher = crypto.createDecipher('aes-256-cbc','열쇠');
let result2 = decipher.update(result, 'base64', 'utf8');
result2 += decipher.final('utf8');
console.log('평문',result2);
url 모듈
// url 모듈
const url = require('url');
const URL = url.URL;
const {URL} = require('url');
const myUrl = new URL('https://www.naver.com?category=nodejs&category=javascript&name=test');
console.log(myUrl);
console.log(url.format(myUrl));
// param 조회하기
console.log(myUrl.searchParams.get('name'));
console.log(myUrl.searchParams.has('page'));
console.log(myUrl.searchParams.getAll('category'));
// param 추가하기
myUrl.searchParams.append('filter',value);
myUrl.searchParams.set('filter','newfilter');
// querystring
const querystring = require('querystring');
const url = require('url');
const parsedUrl = url.parse('http://www.naver.com?name=hi');
const query = querystring.parse(parsedUrl.query);
console.log('query string : ',query);
console.log(querystring.stringify());
path 모듈
// path 모듈
const path = require('path');
console.log(path.sep); // window : \\, mac: /
console.log(path.delimiter); // window: ; , mac: : (환경변수 구분자)
path.dirname(__filename); // 전체경로
path.extname(__filename); // .js
path.basename(__filename); // test
path.parse(__filename); // {dir,base,ext,name}
path.format({
root:
dir:
base:
ext:
name
});
path.normalize('C:\\users\\test.js');
path.isAbsolute('C:\\') // true
path.relative('C:\\users','C:\\'); // ..\\
path.join(__dirname,'..','..','/users','.','/test'); // 절대 경로 무시하고 합침
path.resolve(__dirname,'..','..','/users','.','/test'); // 절대 경로 고려하고 합침 (C:/users/test)
os, process, __filename, __dirname
console.log(__dirname);
console.log(__filename);
// 멀티 프로세싱
// process : 현재 실행중인 노드 프로그램 정보
process.arch; // x86,
process.version; // node version
process.platform; // win32
process.pid; // process id
process.uptime(); // 노드 프로그램이 실행된 지 지난 시간
process.cwd(); // 프로세스 실행 위치
process.cpuUsage();
process.exit();
// desktop 프로그램 만들 때 보통 사용
// os 모듈
const os = require('os');
os.arch();
os.platform();
os.type();
os.uptime();
os.hostname();
os.release();
os.homedir();
os.tmpdir();
os.freemem();
os.totalmem();
os.cpus(); // node process를 cpu개수만큼 만듦 ( 멀티 프로세싱 )
노드 모듈 시스템
// 노드 모듈 시스템
const {odd,even} = require('./var');
// var.js
const odd = '홀수';
const even = '짝수';
module.exports = {odd,even};
exports.odd = odd;
exports.even = even;
'Back-End > NodeJS' 카테고리의 다른 글
노드 프로젝트를 깔끔하게 작성하기 (0) | 2019.02.21 |
---|---|
1. Node.js 개요 (0) | 2019.01.09 |
ES2015 이후의 비동기 제어 흐름 패턴( Asynchronous Control Flow pattern ) -node.js (0) | 2019.01.08 |
1. Asynchronous Event-Driven 프로그래밍에 관하여 - Mastering Node.js (0) | 2019.01.03 |
0.노드란 무엇인가? - Mastering Node.js (0) | 2019.01.03 |