본문 바로가기

개발/연구

[javascript] node.js 모듈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
javconst {require_test1, require_test2} = require('./require.js');
// require.js에서 값을 불러옴
 
require_test1();
console.log(require_test2);
 
// global
// 어디에서나 쓸 수 있는 "전역 객체" 이는, setTimeout을 쓸 때 window.setTimeout을 생략하는 것과 같다.
// 사용 안하는게 좋으니, 개념만 알아두고 생략.
 
// console
 
const obj = {
    dep1:{
        dept2:{
            dept3:{
                test:'기쥬짱'
            },
        },
    },
};
 
console.time('시간 체크');
console.log('일반적으로 사용하던 로그');
console.error('에러 메시지');
console.timeEnd('시간 체크');
// time과 timeEnd는 인자가 같아야 함.
// output:
// 일반적으로 사용하던 로그
// 에러 메시지
// 시간 체크: 0.384ms
 
console.dir(obj, {colors:true, depth:1});
console.dir(obj, {colors:true, depth:2});
console.dir(obj, {colors:true, depth:3});
// 콘솔의 깊이 만큼만 표시해 줌. 꽤나 유용하니까 잘 익혀두자.
// output:
// { dep1: { dept2: [Object] } }
//     { dep1: { dept2: { dept3: [Object] } } }
//     {
//       dep1: { dept2: { dept3: { test: '기쥬짱' } } }
//     }
const example1 = () =>{
    console.trace('위치 추적');
}
 
const example2 = () => {
    example1();
}
 
example2();
// output:
// at example1 nodejs.js:35:13)
// at example2 nodejs.js:39:5)
 
console.log(__filename);
console.log(__dirname);
// c:\Users\user\Desktop\    \개인 자료\nodejs lec\nodejs.js
// c:\Users\user\Desktop\    \개인 자료\nodejs lec
// 타이머 객체
 
const timeout = setTimeout(() =>{
    console.log.apply('1.5초 후 실행');
}, 1500);
 
const interval = setInterval(() =>{
    console.log.apply('1초 마다 실행');
}, 1000);
 
clearTimeout(timeout);
clearTimeout(interval);
// 타이머 끄기.
 
// 현재 실행 중인  정보를 다루는 process 객체, 현재 컴퓨터 환경의 정보를 다루는 os 객체는 생략
// URL 모듈, path 모듈 유용하니 다큐먼트 볼 것.
 
// 암호화
// 단방향 암호화
const crypto = require('crypto');
const hash = crypto.createHash('sha512').update('dlrlwn1212').digest('base64');
console.log(hash);
// 기본적인 해쉬 방법.
 
crypto.randomBytes(64, (err, buf) =>{
    const salt = buf.toString('base64');
    console.log('salt', salt);
    crypto.pbkdf2('소금치기소금치기!', salt, 1000064'sha512', (err, key) =>{
        console.log('password', key.toString('base64'));
    })
});
// 양방향 암호화
 
// const crypto = require('crypto');
 
const cipher = crypto.createCipher('aes-256-cbc''key');
let cipher_result = cipher.update('kiju''utf8''base64');
cipher_result += cipher.final('base64');
console.log('암호화 -> ', cipher_result);
// output:
// 암호화 ->  JMkPLOeMaYcnwo7PDuh6cw==
const decipher = crypto.createDecipher('aes-256-cbc''key');
let cipher_result2 = decipher.update(cipher_result, 'base64''utf8');
cipher_result2 += decipher.final('utf8');
console.log('복호화 -> ', cipher_result2);
// output:
// 복호화 ->  kiju
 
// promisify
const util = require('util');
 
const randomBytesPromise = util.promisify(crypto.randomBytes);
const pbkdf2Promise = util.promisify(crypto.pbkdf2);
 
crypto.randomBytes(64, (err, buf) =>{
    const salt = buf.toString('base64');
    console.log('salt', salt);
    crypto.pbkdf2('소금치기소금치기!', salt, 1000064'sha512', (err, key) =>{
        console.log('password', key.toString('base64'));
    })
});
// 콜백 형식을 프로미스, Async/Await를 사용할 수 있게끔 해줌.
 
randomBytesPromise(64)
    .then((buf)=>{
        const salt = buf.toString('base64');
        console.log('salt', salt);
        return crypto.pbkdf2('소금치기소금치기!', salt, 1000064'sha512');
    })
    .then((key) =>{
        console.log('password', key.toString('base64'));
    })
    .catch((err) =>{
        console.error(err);
    });
 
    (async () =>{
        const buf = await randomBytesPromise(64);
        const salt = buf.toString('base64');
        const key = await pbkdf2Promise('소금치기소금치기!', salt, 1000064'sha512');
        console.log('password', key.toString('base64'));
    });
 
// 파일 입출력 -> 동기식 표현
// 읽기
const fs = require('fs');
 
console.log('시작');
let data = fs.readFileSync('./readme.txt');
console.log('1번', data.toString());
data = fs.readFileSync('./readme.txt');
console.log('2번', data.toString());
data = fs.readFileSync('./readme.txt');
console.log('3번', data.toString());
console.log('끝');
 
// 파일 복사
const readStream = fs.copyFile('url1''url2', (err =>{
    console.log(err);
}));
 
// buffer / stream
// 데이터에서 버퍼가 가득차면 스트림으로 넘김, 이 부분은 심화 부분이므로 간단한 웹 사이트 제작에는 크게 사용 안할 것으로 예상함.
// 필요 시 채워넣기
 
// 이벤트
 
const EventEmitter = require('events');
// 커스텀 이벤트.
const myEvent = new EventEmitter();
 
myEvent.addListener('conn', () => {
    console.log('접속 완료');
})
myEvent.on('conn', () => {
    console.log('접속 완료');
})
const create = myEvent.on('conn', () => {
    myEvent.emit('create');
})
// 위 두개는 같은 이벤트 리스너 등록(같은 함수라 생각하면 됨.)
 
myEvent.on('disConn', ()=>{
    console.log('연결 해제');
})
 
myEvent.once('create', ()=>{
    console.log('생성 됨.');
})
//  단 한번만 실행 됨.
 
myEvent.emit('conn');
myEvent.emit('disConn');
// 이벤트를 발동.
 
myEvent.removeListener('conn', create);
// conn 이벤트 중 create을 지움.
 
myEvent.listenerCount('conn');
// 이벤트 개수 세기
cs

 

기본적인 node.js의 모듈 사용방법입니다.

(개인적으로 제가 보기 좋게 만든거라 배포용은 아닙니다)

 

const require_test1 = () =>{
    return "function require test done.";
};

const require_test2 = "const require test done.";

// exports.require_test1 = require_test1;
// exports.require_test2 = require_test2;

module.exports = {
    require_test1,
    require_test2
};

require.js