터미널에서 node
다 알제?
아래와 같은 두 가지 방식이 있다.
const odd = "oddNum";
const even = "evenNum";
module.exports = { odd, even };
//index.js
const {odd, even } = require('./var');
exports.odd = "oddNum";
exports.even = "evenNum";
ES6문법을 활용한 모듈
바로는 안되고
파일의 확장자를 .mjs로 지정하거나 package.json에 type:"module"속성을 넣어야 한다.
const odd = "oddNum";
const even = "evenNum";
export defaults = { odd, even }
// import
import { odd, even } from './var'
전역객체, 모든 파일에서 접근가능하다.
global.message를 export해서 파일간 데이터 전달 가능하지만 유지보수가 힘들어지므로 사용하지말것
console.time('label')
console.timeEnd('label')
console.table([obj1, obj2]); // DBlike printing
console.dir(obj);
console.trace('label')
아래 타이머 3총사는 생성시 자신의 id를 반환한다
타이머를 취소하려면 id가 필요하다
퀴즈
아래 코드의 실행 결과는? 정답
const timeout = setTimeout(() => {
console.log('A runs after 1.5sec');
}, 1500);
const interval = setInterval(() => {
console.log('B runs every 1 sec');
}, 1000);
const timeout2 = setTimeout(() => {
console.log('C Not Running');
}, 3000);
setTimeout(() => {
clearTimeout(timeout2);
clearInterval(interval);
}, 2500)
const immediate = setImmediate(() => {
console.log('D runs Right NOW!');
});
const immediate2 = setImmediate(() => {
console.log('E not running');
}
clearImmediate(immediate2)
setImmediate(callback) vs setTimeout(callback, 0)
현재 파일명과 폴더명을 나타낸다. path모듈과 함께 사용된다.
module.exports 와 exports는 같은 객체를 참조한다.
한 파일에 둘을 혼용하지 않는 것이 좋다.
노드의 글로벌 컨텍스트에서 this는 무엇일까?
this === module.exports //true
this === exports //true
노드는 순환참조 발생시 순환참조되는 대상을 빈 객체로 만들어버린다.
발생하지 않도록 유의해서 코딩한다.
현재 실행중인 노드 프로세스에 대한 정보를 담고 있다.
process.env
process.version
process.pid
process.uptime()
process.cwd()
process.exit(CODE) // 0은 정상, 이외는 비정상 종료
process.nextTick(callback)
setImmediate(() => {
console.log('immediate');
});
process.nextTick(() => {
console.log('nextTick');
});
setTimeout(() => {
console.log('timeout');
}, 0);
Promise.resolve().then(() => console.log('promise'));
// nextTick -> promise -> timeout -> immediate
주요 메서드
os.type()
os.platform()
os.uptime()
os.cpus().length
os.tmpdir
path.basename(pathString, extname)// filename without ext
path.parse(pathString)
path.format(obj)
path.join('/','usr','local','node') // /usr/local/node
노드에서 URL은 두가지 종류가 있다. 일반적으로 WHATWG 방식이 편리하지만 예전 방식을 활용해야만 하는 경우도 있다.
const url = require('url'):
urlString = "https://www.google.com/search?q=complex+query+string&rlz=1C5CHFA_enKR978KR978&oq=complex+query+string&aqs=chrome..69i57j0i19j0i8i19i30l4.3831j1j4&sourceid=chrome&ie=UTF-8"
let WHATWGUrl = new URL(urlString);
url.format(WHATWGUrl);
{searchParams: URLSearchParams {
'q' => 'complex query string',
'rlz' => '1C5CHFA_enKR978KR978',
'oq' => 'complex query string',
'aqs' => 'chrome..69i57j0i19j0i8i19i30l4.3831j1j4',
'sourceid' => 'chrome',
'ie' => 'UTF-8' }
}
let searchParams = WHATWGUrl.searchParams;
searchParams.append()
searchParams.set()
searchParams.delete()
searchParams.toString()
const url = require('url'):
const querystring = require('querystring');
urlString = "https://www.google.com/search?q=complex+query+string&rlz=1C5CHFA_enKR978KR978&oq=complex+query+string&aqs=chrome..69i57j0i19j0i8i19i30l4.3831j1j4&sourceid=chrome&ie=UTF-8"
let parsedUrl = url.parse(urlString);
url.format(parsedUrl);
query = querystring.parse(paredUrl.query);
암호화는 멀티스레드로 작동함
간단한 암호화를 위해서는 crypto-js 패키지 활용을 추천함.
util.deprecate
util.promisify : 콜백패턴을 프로미즈로 바꿈
const util = require('util');
const crypto = require('crypto');
const dontUseMe = util.deprecate((x, y) => {
console.log(x + y);
}, 'do not use this function, it is deprecated');
const randomBytesPromise = util.promisify(crypto.randomBytes);
워커 스레드 모듈로 노드에서도 멀티 스레드 방식으로 작업 가능하다.
메인스레드에서 워커스레드를 생성하고, 메시지로 통신한 다음 작업이 끝나면 모인 데이터를 취합한다.
외부 명령어 실행시키고 싶을 때 사용한다.
결과는 이벤트리스너에 버퍼 형태로 전달된다.
const exec = require('child_process').exec;
const process = exec('ls')
process.stdout.on('data', data => {
console.log(data.toString());
}
const spawn = require('child_process').spawn;
const process = spawn('python', ['test.py']);
assert
string_decoder
tls
net
D - B - A - B