2016-11-26 3 views
0

내가 노드에서 MySQL의 쿼리를 실행하기위한 코드를 분리 할, 그래서 여기하우투 노드 module.exports

/* pool -create connection pool mysql*/ 
var sqlQuery = function (sqlString) { 
    var _result = pool.getConnection(function (err, connection) { 
/* error handling*/ 
    connection.query(sqlString, function (err, rows) { 
     console.log(this.sql); 
     if (!err) { 
      return _result = rows; <============ 
     } 
     connection.release(); 
    }); 
    return; 
    }); 
    console.log(_result); 
    return { recordSet : _result } 
}; 
module.exports = sqlQuery; 

가 어떻게 내 app.js. 행을 반환 할 수 밝히려 모듈 패턴을 사용하는 것을 시도하고있다 은 SQLQuery를 호출 아래 코드는

var SqlQuery = require(./path/to/sqlQueryFile); 
var rows = SqlQuery('pass sql here').recordSet; 
console.log(row); 
res.json(rows); 

답변

1

귀하의 코드가 비동기 작동하지 않습니다,하지만 당신은 기적을 호출하고 있습니다.

이렇게하고 싶으면 SqlQuery에 콜백을 전달해야합니다.

var SqlQuery = require(./path/to/sqlQueryFile); 
var rows = SqlQuery('pass sql here', function(recordSet){ 
    console.log(recordSet); 
    res.json(recordSet); 
}); 

편집 :

/* pool -create connection pool mysql*/ 
var sqlQuery = function (sqlString, callback) { 
    var _result = pool.getConnection(function (err, connection) { 
    /* error handling*/ 
     connection.query(sqlString, function (err, rows) { 
     console.log(this.sql); 
     if (!err) { 
      callback(rows); 
     } 
     connection.release(); 
     }); 
    }); 
}; 
module.exports = sqlQuery; 

그리고 그것을 호출 자바 스크립트의 최신 버전을 사용하는 경우, 당신은 더 많은 몇 가지 옵션이 있습니다.

function sqlQuery (sqlString) { 
    return new Promise((resolve, reject) => { 
    pool.getConnection(function (err, connection) { 
     if (err) { return reject(err); } // error handling 
     connection.query(sqlString, function (err, rows) { 
     if (err) { return reject(err); } 
     resolve(rows); 
     connection.release(); 
     }); 
    }); 
    }); 
} 
module.exports = sqlQuery; 

을 그리고 당신이 좋아 사용하십시오 :

당신이 약속에 액세스 할 수있는 경우, 당신은이 작업을 수행 할 수 있습니다 당신도 새로운 자바 스크립트 를 사용하는 경우

var SqlQuery = require(./path/to/sqlQueryFile); 
SqlQuery('pass sql here') 
    .then(function(recordSet) { 
    console.log(recordSet); 
    res.json(recordSet); 
    }) 
    .catch(function(err) { 
    // do your error handling 
    res.status(500).json({ err: 'Sorry there was an error' }); 
    }); 

, async/await 구문을 사용할 수 있습니다 (현재 Babel을 통해 사용 가능하며 FireFox에서 생각합니다 .V55의 Chrome).

체인
var SqlQuery = require(./path/to/sqlQueryFile); 
async handleQuery(query) { 
    try { 
     var rows = await SqlQuery(query); 
     res.json(rows); 
    } catch (e) { 
    console.log('Error!', e); 
    } 
} 

여러 쿼리 함께 : 나는 중첩 콜백이 여러 쿼리를 실행하는 경우처럼 밖으로 데이터를 얻을하려는 경우

async handleQuery(query) { 
    try { 
     return await SqlQuery(query); 
    } catch (e) { 
    console.log('Error!', e); 
    } 
} 

var rows = await handleQuery('select * from tablename'); 
var rowsToReturn = await handleQuery('select id from another_table where name = "' + rows[0].name + '"'); 
+0

감사 데이비드, 그래서, 난 그냥에있다 데이터를 콜백으로 랩핑한다. 정말보기 흉한 코드가 될 것입니다. 깨끗한 방법이 있습니까? –

+0

@MoHassan이 내 편집을 참조하십시오. – David

+0

더 많은 옵션을 사용하여 양식을 선택해 주셔서 감사합니다. –