2017-06-09 30 views
0

私は非常に単純なWebアプリケーションで作業していますが、1つのテーブルでINSERTとSELECT操作のデータベースに接続します。私はいくつかの偉大なチュートリアルをブラウズしている間に私が利用した機能を持っていますが、SELECTクエリからrowsを返すことに問題があります。私はNode.JSを学んでいることに留意してください。クエリ(SELECT)から返されたデータをこのブロックにどのように表示するのですか?関数node.js/MySQLの内部関数からの戻り値

app.post("/getcsv", function(req,res){ 

var sqlselall = "SELECT * FROM office"; 
var rows = handle_database(sqlselall); 
res.json(rows); 
res.end(); 

(使用プーリング)データベース接続を処理するための機能:内部機能でrowsは私が必要とするデータが含まれていることを私は実感

function handle_database(sqlstmt){ 

pool.getConnection(function(err,connection){ 

    if(err) { 
     res.json({"code" : 100, "status" : "Error in connection to database."}); 
     return; 
    } 

    console.log('connected as id ' + connection.threadId); 

    connection.query(sqlstmt, function(err,rows){ 
     connection.release(); 
     if(!err){ 
      console.log("Number of rows affected: " + rows.affectedRows); 
     } 

    }); 

    connection.on('error', function(err) { 
     res.json({"code": 100, "status" : "Error in connection to database."}); 
     return; 
    }); 

、しかし、私はとのように途方に暮れてよ私は関数を呼び出すときにそれを返す方法。

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-コール) – Paul

+0

@Paul - 残念ながら私はJSのコールバックの概念を完全に把握していません。 – Smitty

+0

これはちょうどあなたがいくつかのチュートリアルを実行する必要があります。コールバックは単なる関数ですが、必要な肉(例えば行)はその関数内でのみスコープされています。したがって、同じスコープで作業する必要があることを確認する必要があります。 – Paul

答えて

0

Node.JSとJSの知識が不足している可能性があるため、いくつかの点を重複していると考えると、特に自分の質問に答えることは不適切ですが、研究(@ポールとコールバック地獄に感謝)、関数、コールバック、匿名関数、Javascriptの関数スコープの性質に関するいくつかの基礎について解明しました。私は自分の問題の解決策を考え出すことができました。私ができるのであれば

app.post("/getcsv", function(req, res) { 

    var sqlselall = "SELECT * FROM office" 
    var thisData = select_query(sqlselall, res) 
}) 

function select_query(sqlstmt, res) { 

    pool.query(sqlstmt, function(err, results, fields) { 
    if (err) throw err 
    res.send(JSON.stringify(results)) 
    }) 
} 
1

:だから、DBへの私の接続のために私はapp.postから(私は今、やや理解)コールバックパラメータからパラメータ「RES」を渡され、新しい単純化された機能を作成しましたあなたが私が持っている答えをコメントしました。これは個人的にはテストしていませんが、あなたの答えが私にとってうまくいくように見えるので、私はあなたの答えを補足したいものです。

私はこれがあなたを助けるかもしれないと思うコールバックスタイルを学ぼうとする経験から。コードを少しモジュラ化しておくのに役立ちます。

app.post("/getcsv", function(req, res) { 
    var sqlselall = "SELECT * FROM office" 
    select_query(sqlselall, function(results){ 
     res.send(results) 
    }) 
}) 

function select_query(sqlstmt, callback) { 
    pool.query(sqlstmt, function(err, results, fields) { 
    //I suppose if this is how you want to handle errors 
    //for debugging purposes I like returning them as well 
    //returning it helps both you and others who might be working on 
    //the front end to know whats happening 
    if (err) throw err 
    callback(JSON.stringify(results)) 
    }) 
} 

あなたselect_query関数は渡さ取得する解像度を必要とせず、動作するために機能を持っているパラメータに依存しないこの方法です。いくつかの時間は助けになることはできませんが、私はそれが考慮に入れてメンテナンスを容易にすることができます。

クエリを行う必要があるが、送信する前に情報を変更する必要がある別のエンドポイントがあるかもしれないという仮説的な状況では、引き続きselect_query関数を使用してコールバックを変更することができますあなたはそれを渡します。ですから、このようなものに終わるだろう:私が言ったように

​​

(私も少しエラー処理を変更)、私はそれが動作しますが、あなたの方法が間違っているつもりはない、とおそらくそれは、より良い動作します君は。私はこれがコールバックのハンドルを手に入れるのを助け、実際にそれらを使用して楽しむことを始めたことを知りました。

+0

ありがとう!あなたの最初のコード例は、実際にコールバックの概念をもう少し戻してくれました。したがって、呼び出す名前付き関数内のコールバック関数に対応するパラメータとして無名関数を渡すことができます。論理的な視点から、素早く把握するための簡単なコンセプトではなく、特にC#からのものです。 – Smitty

+0

そうですね、違うパラダイムのようなものですが、私はそれを本当に楽しんでいます。それが助けてくれてうれしいです。 – Jeff