1. 이벤트
노드에는 이벤트를 보내고 받을 수 있도록 EventEmiiter 라는 것이 만들어져 있다.
- 이벤트를 처리하는 EventEmitter의 주요 메소드
메소드 이름 |
설명 |
on(event, listener) |
지정한 이벤트의 리스너를 추가 |
once(event, listener) |
지정한 이벤트의 리스너를 추가하지만 한 번 실행한 후에는 자동으로 리스너가 제거 |
removeListener(event, listener) |
지정한 이벤트에 대한 리스너를 제거 |
process.on('tick', function(count) { console.log('tick 이벤트 발생함 : %s', count); }); setTimeout(function() { console.log('2초 후에 tick 이벤트 전달 시도함.');
process.emit('tick', '2'); }, 2000); |
|
var util = require('util'); var EventEmitter = require('events').EventEmitter; var Calc = function() { var self = this;
this.on('stop', function() { console.log('Calc에 stop event 전달됨.'); }); }; util.inherits(Calc, EventEmitter); // 이벤트 상속 Calc.prototype.add = function(a, b) { return a + b; } module.exports = Calc; module.exports.title = 'calculator'; |
var Calc = require('./calc3'); var calc = new Calc(); calc.emit('stop'); console.log(Calc.title + '에 stop 이벤트 전달함.'); console.log('1+2='+calc.add(1,2)); |
|
2. File I/O 동기식, 비동기식
메소드 이름 |
설명 |
readFile(filename, [encoding], [callback]) |
비동기식 IO로 파일을 읽기 |
readFileSync(filename, [encoding]) |
동기식 IO로 파일을 읽기 |
writeFile(filename, encoding='utf8', [callback]) |
비동기식 IO로 파일을 쓰기 |
wrtieFileSync(filename, encoding='utf8') |
동기식 IO로 파일을 쓰기 |
- 동기식
var fs = require('fs'); // 파일을 동기식 IO 방식으로 읽어 들입니다. var data = fs.readFileSync('./package.json', 'utf8'); // 읽어 들인 데이터를 출력합니다. console.log(data); |
// 잘못된 파일을 읽어들여 에러 발생시킨 코드 var fs = require('fs'); // 파일을 동기식 IO 방식으로 읽어 들입니다. var data = fs.readFileSync('./package22.json', 'utf8'); // 읽어 들인 데이터를 출력합니다. console.log(data); |
|
|
- 비동기식
var fs = require('fs'); //파일을 비동기식 IO 방식으로 읽어 들입니다. fs.readFile('./package.json', 'utf8', function(err, data) { if(err == null) { // 읽어 들인 데이터를 출력합니다. console.log(data); }else{ // 읽어 들인 에러를 출력합니다. console.log(err); } }); console.log('프로젝트 폴더 안의 package.json 파일을 읽도록 요청했습니다.'); |
// 잘못된 파일을 읽어들여 에러 발생시킨 코드 var fs = require('fs'); //파일을 비동기식 IO 방식으로 읽어 들입니다. fs.readFile('./package22.json', 'utf8', function(err, data) { if(err == null) { // 읽어 들인 데이터를 출력합니다. console.log(data); }else{ // 읽어 들인 에러를 출력합니다. console.log(err); } }); console.log('프로젝트 폴더 안의 package.json 파일을 읽도록 요청했습니다.'); |
|
|
3. 파일을 직접 Open. Close. Read, Write
메소드 이름 |
설명 |
open(path, flags [,mode] [,callback]) |
파일을 연다 |
read(fd, buffer, offset, length, position [,callback]) |
지정한 부분의 파일 내용을 읽어 들인다 |
write(fd, buffer, offset, length, position [,callback]) |
파일의 지정한 부분에 데이터를 쓴다 |
close(fd [,callback]) |
파일을 닫는다 |
플래그 |
설명 |
'r' |
읽기에 사용하는 플래그입니다. 파일이 없으면 예외가 발생 |
'w' |
쓰기에 사용하는 플래그입니다. 파일이 없으면 만들어지고 파일이 있으면 이전 내용을 모두 삭제 |
'w+' |
읽기와 쓰기에 모두 사용하는 플래그입니다. 파일이 없으면 만들어지고 파일이 있으면 이전 내용을 모두 삭제 |
'a+' |
읽기와 추가에 모두 사용하는 플래그입니다. 파일이 없으면 만들어지고 있으면 이전 내용에 새로운 내용을 추가 |
var fs = require('fs'); //파일에 데이터를 씁니다. fs.open('./output.txt', 'w', function(err, fd) { if(err) throw err; var buf = new Buffer('안녕!\n'); fs.write(fd, buf, 0, buf.length, null, function(err, written, buffer) { if(err) throw err;
console.log(err, written, buffer);
fs.close(fd, function() { console.log('파일 열고 데이터 쓰고 파일 닫기 완료.'); }); }); }); |
|
var fs = require('fs'); //파일에서 데이터를 읽어 들입니다. fs.open('./output.txt', 'r', function(err, fd) { if(err) throw err;
var buf = new Buffer(10); console.log('버퍼 타입 : ', Buffer.isBuffer(buf));
fs.read(fd, buf, 0, buf.length, null, function(err, bytesRead, buffer) { if(err) throw err;
var inStr = buffer.toString('utf8', 0, bytesRead); console.log('파일에서 읽은 데이터 : %s', inStr);
console.log(err, bytesRead, buffer);
fs.close(fd, function() { console.log('output.txt 파일을 열고 읽기 완료.'); }); }); }); |
|
// 버퍼 객체를 크기만 지정하여 만든 후 문자열을 씁니다. var output = '안녕 1!'; var buffer1 = new Buffer(10); var len = buffer1.write(output, 'utf8'); console.log('첫번째 버퍼의 문자열 : %s', buffer1.toString()); // 버퍼 객체를 문자열을 이용해 만듭니다. var buffer2 = new Buffer('안녕 2!', 'utf8'); console.log('두번째 버퍼의 문자열 : %s', buffer2.toString()); // 타입을 확인합니다. console.log('버퍼 객체의 타입 : %s', Buffer.isBuffer(buffer1)); // 버퍼 객체에 들어있는 문자열 데이터를 문자열 변수로 만듭니다. var byteLen = Buffer.byteLength(output); var str1 = buffer1.toString('utf8', 0, byteLen); var str2 = buffer2.toString('utf8'); // 두번째 버퍼 객체의 문자열을 첫 번째 버퍼 객체로 복사합니다. buffer1.copy(buffer2, 0, 0, len); console.log('두번째 버퍼에 복사한 후의 문자열 : %s', buffer2.toString('utf8')); // 두 개의 버퍼를 붙여줍니다. var buffer3 = Buffer.concat([buffer1, buffer2]); console.log('두 개의 버퍼를 붙인 후의 문자열 : %s', buffer3.toString('utf8')); |
|
- 스트림 단위로 File Read & Write
메소드 이름 |
설명 |
createReadStream(path [,options]) |
파일을 읽기 위한 스트림 객체를 만듬 |
createWriteStream(path [,options]) |
파일을 쓰기 위한 스트림 객체를 만듬 |
options : flags, encoding, autoClose 속성이 들어있는 자바스크립트 객체를 전달할 수 있음
var fs = require('fs'); var infile = fs.createReadStream('./output.txt', {flags: 'r'} ); var outfile = fs.createWriteStream('./output2.txt', {flags: 'w'}); infile.on('data', function(data) { console.log('읽어들인 데이터', data); outfile.write(data); }); infile.on('end', function() { console.log('파일 읽기 종료.'); outfile.end(function() { console.log('파일 쓰기 종료.'); }); }); |
|
var fs = require('fs'); var inname = './output.txt'; var outname = './output2.txt'; fs.exists(outname, function (exists) { if (exists) { fs.unlink(outname, function (err) { if (err) throw err; console.log('기존 파일 [' + outname +'] 삭제함.'); }); }
var infile = fs.createReadStream(inname, {flags: 'r'} ); var outfile = fs.createWriteStream(outname, {flags: 'w'}); infile.pipe(outfile); console.log('파일 복사 [' + inname + '] -> [' + outname + ']'); }); |
|
- http 모듈로 요청받은 파일 내용을 읽고 응답
var fs = require('fs'); var http = require('http'); var server = http.createServer(function (req, res) { // 파일을 읽어 응답 스트림과 pipe()로 연결합니다. var instream = fs.createReadStream('./output.txt'); instream.pipe(res); }); server.listen(7001, '127.0.0.1'); |
var fs = require('fs'); var http = require('http'); var server = http.createServer(function (req, res) { // 인코딩 utf-8 적용 res.writeHead(200, { "Content-Type": "text/html; charset=utf-8", "Content-Transfer-Encoding": "binary" }); // 파일을 읽어 응답 스트림과 pipe()로 연결합니다. var instream = fs.createReadStream('./output.txt'); instream.pipe(res); }); server.listen(7001, '127.0.0.1'); |
|
|
var fs = require('fs'); fs.mkdir('./docs', 0666, function(err) { if (err) throw err; console.log('새로운 docs 폴더를 만들었습니다.');
fs.rmdir('./docs', function(err) { if (err) throw err; console.log('docs 폴더를 삭제했습니다.'); }); }); |
로그파일 남기기
- 사전작업
- 로그수준(Log Level)란?
로그 수준이란 어떤 정보가 출력할 것인지 결정하는 것.
winston모듈에서 사용하는 로그 수준은 다음처럼 단계별로 구성되며, 하위 수준은 상위 수준을 모두 포함하여 출력
debug:0 > info:1 > notice:2 > warning:3 > error:4 > crit:5 > alert:6 > emerg:7