2013-10-07 3 views
1

내가 달성하려고하는 닫는 내부 DB 쿼리를 만드는 것입니다. 데이터를 반환 한 다음 물건을 사용자에게 보냅니다. 데이터베이스 풀링을 사용하는 것이 가장 좋습니다. 문제는 쿼리가 동기화되지 않는다는 것입니다.Node.js, Express 및 MySQL. 어떻게 올바른 방법입니다.

간체 코드 : 예에서

server.js

var express = require('express'), 
    app = express(), 
    server = require('http').createServer(app), 
    mysql = require('mysql'); 

app.set('DB:pool', mysql.createPool(process.env.DATABASE_URL)); 

var myClosure = require('./closure.js')(app)); 

app.get('/somepage', function(req, res) { 
    var data = myClosure.myquery(); 
    res.send(data); 
}); 

app.get('/anotherpage', function(req, res) { 
    var data = myClosure.myquery(); 
    res.send(data); 
}); 
app.listen(3000); 

closure.js

function myClosure(app) { 
    var pool = app.get('DB:pool'); 
    return { 
     myquery: function(inp) { 
      pool.getConnection(function(err, db) { 
       if (err) throw err; 
       db.query('SELECT * FROM table', function(err, rows, fields) { 
        if (err) throw err; 
        data = rows[0] 
        db.release(); 
       }); 
      }); 
      return data; 
     } 
    }; 
} 
module.exports = myClosure; 

내가 모든 DB 관련 물건 경로 콜백 및 응답에서 만들어진 발견 쿼리 콜백에서 보냈습니다. 하지만 SQL 쿼리가 거기서 완료되지 않았기 때문에 myquery가 undefined를 리턴하므로 작동하지 않으려 고합니다.

그래서 쿼리를 처리하는 올바른 방법은 무엇입니까?

답변

7

은 쿼리 기능이 너무 콜백을 처리합니다 :

// server.js 
app.get('/somepage', function(req, res) { 
    myClosure.myquery(function(err, data) { 
    // TODO: handle error... 
    res.send(data); 
    }); 
}); 

// closure.js 
... 
myquery: function(callback) { 
    pool.getConnection(function(err, db) { 
    if (err) return callback(err); 
    db.query('SELECT * FROM table', function(err, rows, fields) { 
     // release connection before we return anything, otherwise it 
     // won't be put back into the pool... 
     db.release(); 
     if (err) return callback(err); 
     callback(null, rows[0]); 
    }); 
    }); 
} 

+0

내가 그 감각을 만드는 것 같아요 (즉, 사용하는 것 같지 않았기 때문에 나는 inp 인수를 왼쪽)! 빠른 대답을 주셔서 감사합니다 – Lauri

+1

오류가 발생하면 DB를 공개하는 것은 어떨까요? 그것은 당신의 모범이 아니라는 것이다. 가상화 계층이 있습니까? 매번 수동으로 처리해야합니까? –

+0

@MaciejDragan 좋은 캐치! 내 대답을 편집 할게 :) – robertklep