BLOG ARTICLE node js | 1 ARTICLE FOUND

  1. 2012.07.01 [NodeJS] Express - DB 연동 - 이벤트를 사용하여 비동기 처리 (2)


노드에서 EventEmitter 를 이용하여 이벤트 방식으로 


웹 서버에서 라우트하는 코드에서


디비작업을 하는 코드를 분리하여, 의존성을 제거하고 비동기 처리 방법.


express 를 사용하였습니다.



1. 서버 js

var express = require('express')

  , routes = require('./routes') // 기본 index.js

  , pp = require('./public/properties').properties

  , clog = require('clog');


var app = module.exports = express.createServer();


.............. 설정들



app.post('/searchArea.margo', routes.searchArea);



2. Route - index.js

var dao = require('./db'); // routes/db.js 

exports.searchArea = function(req, res){

var cb = dao.getArea(req.body);

cb.on('end', function(err, result){

if(err) throw err;

res.send(result);

});

};



3. DB - db.js
(MySql을 사용하였습니다.)

var db = require('mysql');


var DATABASE = '데이타베이스 명';

var MYSQL_USER = "root";

var MYSQL_PASS = "apmsetup"; 


var mysql = db.createClient({

host: '127.0.0.1'

, database : DATABASE

, user: MYSQL_USER

    , password: MYSQL_PASS

});


var EventEmitter = require('events').EventEmitter;


var dao = module.exports = {


getArea: function(param){

var evt = new EventEmitter();

mysql.query("SELECT * FROM address WHERE area3 like concat(?, '%')"

, [param.searchText]

, function(err, result, fields){


evt.emit('end', err, result);

});

return evt;

}

};



설명

3번 에서 EventEmitter 를 생성하여 디비쿼리를 실행시킨후에 evt 를 리턴한다. (쿼리는 아직 끝나지않았다. 쿼리를 실행만 시켜놓고 바로 evt를 리턴해버린다.)


2번 에서 cb 는 3번에서 리턴해준 evt 에 on 리스너를 달아서 아까 발생시킨 'end' 이벤트를 기다린다.


디비 쿼리 작업이 다끝나고 디비결과가 콜백메소드로 들어오면 'end'이벤트를 발생시킨다. res.send(result);


그러면 2번에서 'end'이벤트에 달았던 리스너가 동작하면서 리스너 콜백이 실행된다.


끝. 즐거운 NodeJS~~~~ 


참고 : 변정훈님이 지으신 NODE.JS 프로그래밍 - 에이콘 출판사

YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 로즈 2012.07.11 14:14 신고  댓글주소  수정/삭제  댓글쓰기

    와 감사합니다.. 도움이 많이 됬어요...

    코멘트 잘 안 다는데.. 너무 재밌게 잘보고 가게되서 몇자 적었네요.. ^^