* 위 내용을 정리하였음
3.7 이벤트 이해하기
- 스트림을 공부할때 on('data', 콜백), on('end', 콜백)을 사용했다. 이는 data, end이벤트가 발생할 때 콜백 함수를 호출하도록 이벤트를 등록한 것이다. createReadStream의 경우 내부적으로 알아서 data, end 이벤트를 호출한다.
- 이번에는 직접 이벤트를 만들고 호출, 삭제해본다.
const EventEmitter = require('events');
const myEvent = new EventEmitter();
myEvent.addListener('event1', () => {
console.log('이벤트 1');
});
myEvent.on('event2', () => {
console.log('이벤트 2');
});
myEvent.on('event2', () => {
console.log('이벤트 2 추가');
});
myEvent.once('event3', () => {
console.log('이벤트 3');
}); // 한 번만 실행됨
myEvent.emit('event1'); // 이벤트 호출
myEvent.emit('event2'); // 이벤트 호출
myEvent.emit('event3');
myEvent.emit('event3'); // 실행 안 됨
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);
myEvent.emit('event5'); // 실행 안 됨
console.log(myEvent.listenerCount('event2'));
- on(이벤트명, 콜백) : 이벤트 이름과 이벤트 발생 시의 콜백을 연결한다.
- addListener(이벤트명, 콜백) : on 이랑 동일
- emit(이벤트명) : 이벤트 호출, 미리등록한 이벤트 콜백이 실행됨
- once(이벤트명, 콜백) : 딱 한번만 실행되는 이벤트 이다. 여러번 호출하더라도 딱 한번만 실행된다.
- removeAllListeners(이벤트 명) : 이벤트에 연결된 모든 이벤트 리스너를 제거한다.
- removeListener(이벤트명, 리스너) : 이벤트에 연결된 리스너를 하나씩 제거
- off(이벤트명, 콜백) : removeListener와 동일
- listerCount(이벤트명) : 이벤트 명에 리스너(콜백)가 몇개 연결되어 있는지 확인
3.8 예외 처리하기
- 노드의 메인 스레드는 하나뿐이므로 에러로 인한 프로세스 종료를 방지해야 한다.
- 즉 에러가 발생하더라도 로그는 기록하되 작업은 계속 진행 되어야 한다.
setInterval(() => {
console.log('시작');
try {
throw new Error('서버를 고장내주마!');
} catch (err) {
console.error(err);
}
}, 1000);
- setInterval로 계속 반복하게 하여 에러가 발생했을때 프로세스가 멈추는지 확인해보자.
- 에러가 발생해도 catch문에서 기록을 남기고 프로세스는 작업을 계속한다.
const fs = require('fs');
setInterval(() => {
fs.unlink('./abcdefg.js', (err) => {
if (err) {
console.error(err);
}
});
}, 1000);
- 프로미스의 에러는 catch를 하지 않아도 알아서 처리하지만 웬만하면 붙여주자.
process.on('uncaughtException', (err) => {
console.error('예기치 못한 에러', err);
});
setInterval(() => {
throw new Error('서버를 고장내주마!');
}, 1000);
setTimeout(() => {
console.log('실행됩니다');
}, 2000);
- 프로세스에 예상치 못한 에러가 발생했을때 이벤트를 등록해두면 setInterval에서 발생한 에러를 로그에 남기고 프로세스는 유지된다.
- 이 방법은 최후의 수단으로, 로깅 목적으로 사용하자.
*맥, 리눅스에서 프로세스 종료하기
lsof - i tcp:포트
- 3000번 포트에 이미 다른 프로세스가 연결되어있다면? 터미널에서 위의 명령을 수행한 결과 프로세스 아이디가 12345일때,
kill -9 프로세스 아이디
- 를 하면 해당 3000번에 연결된 프로세스를 종료할 수 있다.
'ComputerScience > NodeJs' 카테고리의 다른 글
node - 5 Package Manager (0) | 2022.01.15 |
---|---|
node - 4 http 모듈로 서버 만들기 (0) | 2022.01.12 |
node - 3.6 파일 시스템 접근하기 (0) | 2022.01.07 |
node - 3.5 노드 내장 모듈 사용하기 (0) | 2022.01.06 |
node - 3.1 노드 기능 알아보기~ 3.4 노드 내장 객체 알아보기 (0) | 2021.12.30 |