2016-11-26 2 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; 

し、次いでそれを呼び出すあなたの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

を参照してくださいフォームを選択するより多くのオプションを持っています –

関連する問題