howto Node module.exports

时间:2016-11-26 01:20:02

标签: javascript mysql node.js

我想在Node中分离执行mysql查询的代码,所以我试图在这里使用Revealing Module模式

/* 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 个答案:

答案 0 :(得分:2)

您的代码是异步的,但您可以同步调用它。

如果您想这样做,您还需要将回调传递给/* 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;

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

然后用:

来调用它
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,则还有其他一些选项。

如果您有权访问Promises,则可以执行以下操作:

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' });
  });

然后你就像使用它一样:

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

如果您正在使用甚至更新的 JavaScript,则可以使用async / await语法(目前可通过Babel获取,我认为在FireFox中可用。在V55中使用Chrome。)

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 + '"');

将多个查询链接在一起:

{{1}}