2016-11-26 90 views
0

我想代碼爲節點執行MySQL查詢分開,所以我試圖用透露出模塊模式在這裏HOWTO節點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; 

然後用調用它。如果你正在使用JavaScript的新版本,你有幾個選項。

如果您有機會獲得承諾,你可以這樣做:

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; 

然後你會使用它像:如果您使用甚至新的JavaScript

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

謝謝,有更多的選項可供選擇 –