2016-11-26 49 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

谢谢,有更多的选项可供选择 –