스트림에서 on('data', 콜백), on('end', 콜백) 을 사용했다
data와 end라는 이벤트가 발생할 때 콜백함수를 호출하도록 이벤트를 등록한 것.
createReadStream은 내부적으로 알아서 data, end 이벤트 호출했지만
직접 이벤트 만들 수 있음
const EventEmitter = require('events');
const myEvent = new EventEmitter();
// on(이벤트명, 콜백). 이벤트이름과 이벤트 발생 시 콜백 연결
// 이 동작은 이벤트 리스닝 이라고 부름
myEvent.on('event2', () => {
console.log('이벤트 2');
});
myEvent.on('event2', () => { // 이벤트 하나에 이벤트 여러 개 달 수 있음
console.log('이벤트 2 추가');
});
myEvent.addListener('event1', () => { // on과 같은 기능
console.log('이벤트 1');
});
myEvent.once('event3', () => {// 한번만 실행 됨
console.log('이벤트 3');
});
myEvent.emit('event1'); // emit(이벤트명). 이벤트 호출 메서드
myEvent.emit('event1');
myEvent.emit('event2');
myEvent.emit('event3');
myEvent.emit('event3'); // once사용 했기때문에 실행 안됨
myEvent.on('event4', () => {
console.log('이벤트 4');
});
myEvent.removeAllListeners('event4'); // 이벤트에 연결된 모든 이벤트 리스너 제거
myEvent.emit('event4'); // 호출 안됨
const listener = () => {
console.log('이벤트 5');
}
myEvent.on('event5', listener);
myEvent.removeListener('event5', listener); // 하나씩 제거. off()도 같은 기능
myEvent.emit('event5'); // 실행 안 됨
console.log(myEvent.listenerCount('event2')); // 현재 리스너 몇개 연결되어 있는지 확인
스트림에서 on('data'), on('end') 이벤트 호출하는 코드는 없지만
내부적으로 chunk 전달시마다 data 이벤트 emit 하고 있음
완료되었을 경우 end 이벤트를 emit 한 것.
예외 처리
노드에서는 예외 처리가 매우 중요하다.
예외들은 실행 중인 노드 프로세스를 멈추게 만듬.
멀테 스레드 프로그램은 스레드 하나가 멈푸면 다른 스레드가 그 일을 대신함.
but 노드의 메인 스레드는 하나뿐이므로 메인 스레드가 멈추면 스레드를 갖고있는 프로세스가 멈춘다는 뜻이고, 전체 서버도 멈춘다는 뜻.
에러를 처리하는 법
에러 로그가 기록되더라도 작업은 계속되어야 함
에러 발생할것 같은 부분 try/catch 로 감싸기
노드 자체에서 잡아주는 에러
const fs = require('fs');
setInterval(() => {
fs.unlink('./abcdefg.js', (err) => {
if (err) {
console.error(err);
}
});
}, 1000)
fs.unlink로 존재하지 않는 파일 지우고 있음
에러 발생하지만 노드 내장 모듈 에러는 실행중인 프로세스 멈추지 않음.
에러를 throw 한 경우에는 노드 프로세스가 멈추기 때문에 반드시 try/catch문으로 잡아야 함.
process.on('uncaughtException', (err) => { // 이벤트 리스너
console.error('예기치 못한 에러!!', err);
});
setInterval(() => {
throw new Error('에러 발생!!!')
}, 1000);
setTimeout(() => {
console.log('실행됩니다');
}, 2000);
process 객체에 uncaughtException 이벤트 리스너를 달았다.
처리 못한 에러 발생 시 이벤트 리스너 실행되고 프로세스 유지 됨.
이 부분 없다면 setTimeout 실행 안됨.
1초만에 setInterval 에서 에러 발생해 프로세스 멈추기 때문
어떻게 보면 uncaughtException 이벤트 리스너로 모든 에러 처리 가능해 보이지만, 노드 공식 문서에서는 최후의 수단으로 사용 명시하고 있다.
노드는 uncaughtException 이벤트 발생 후 다음 동작 제대로 동작하는지 보증하지 않음. 즉 복구 작업 코드 넣어도 그것이 동작할지 확신 못함
따라서 uncaughtException은 단순 에러 기록 용도로 사용하고 기록 후 process.exit()으로 프로세스 종료하는 것이 좋다.
에러 코드 수정하지 않는 이상 프로세스 실행되는 동안 에러 계속 발생할 것.