2017-09-02 7 views
1

私は顧客データと顧客の購入を返すapp.getを持っています。このapp.getの内部では、2つのmysql呼び出しを実行し、戻す配列を作成する必要があります。クエリを実行してそのデータを処理するにはどうすればよいですか?

クエリを実行してそのデータを処理するにはどうすればよいですか?

app.get('/customer', function (req,res) { 
    var response1 = []; 
    var response2 = []; 
    var processedData = []; 

     connection.query('QUERY HERE', function(err, rows, fields) { 
     if (!err){ 
       response.push({rows}); 
     } else { 
      res.status(400).send(err); 
     } 
    }); 

    //for loop 'response' results and perform another query 
    for (var i = 0; i < response1.length; i++) { 
     var row = response1[i]; 
     connection.query('QUERY HERE FOR row.customerid', function(err, rows, fields) { 
      if (!err){ 
       processedData.push({'Customer Name:' : row.customername, 'purchases' : rows}); 
      } else { 
       res.status(400).send(err); 
      } 
     }); 
     } 


    //Send json back 
    res.setHeader('Content-Type', 'application/json'); 
    res.status(200).send(JSON.stringify(processedData)); 

}); 
+0

に似たものになります。ところで、JSでは通常、(err){return res.status(400.send(err)}を返します。エラーがなくブロック内にある必要がない場合、そのブロックの後のコードが実行されます。ちょっときれいにしてください。このようにすると、ループと2番目のクエリがifブロックの後に来るでしょう。 – Nocturno

+0

こんにちは@Nocturnoは、上記の2番目のクエリとforループを追加しました。 – user964627

+0

ええ、あなたが達成しようとしていたものを見て、他の人があなたに複雑な非同期ライブラリを使用するよう説得しようとする前に標準的な非同期方法を見せたいと思っていました。最初のコールバックの中にループと2番目のクエリを追加する必要があるということです。そのコールバックは、非同期動作がどのように動作するかをasync関数が戻った後にのみ実行されます。 – Nocturno

答えて

2

複雑な非同期操作を行うための機能の束を提供async.jsと呼ばれる非常に便利なモジュールがあります。あなたが別の非同期操作/タスクの結果を下に渡す必要がある場合に、特に、

  • async.waterfall()は素晴らしいです。

  • async.mapSeries()は、非同期操作/タスクの配列の結果を使用して新しい配列を作成する必要がある場合に最適です。

両方を使用しましょう。

私が正しくあなたのコードを理解している場合、コードがあればブロック内で、あなたのループと2番目のクエリを追加

app.get('/customer', function (req, res) { 
    async.waterfall([ 
     // each task is passed a callback 'cb' as last argument; 
     // you MUST call it at least and at most once within each task; 
     // if you pass an error into the callback as the first argument, it will stop the async function 
     function task1 (cb1) { 
      //connection.query('QUERY HERE', function(err, rows, fields) { 
      // if (err) return cb1(err); // stop waterfall() if an error occurred 
      // cb1(null, rows, fields); // pass results down to next task 
      //}); 

      connection.query('QUERY HERE', cb1); // shorter version 
     }, 
     function task2 (rows, fields, cb2) { 

      // iterate and run async operation over each element in array 'rows' 
      async.mapSeries(rows, function getPurchases (row, cb3) { 
       connection.query('QUERY HERE FOR row.customerid', function (err, purchases, fields) { 
        if (err) return cb3(err); // stop mapSeries() if an error occurred 
        cb3(null, { 'Customer Name': row.customername, 'purchases': purchases }) 
       }); 
      }, function (err, customers) { 
       // when mapSeries() is done iterating OR if an error occurred, it will come here 

       if (err) return cb2(err); // stop waterfall() if an error occurred 
       cb2(null, customers) 
      }); 

     // }, cb2); // shorter version 

     } 
    ], function (err, customers) { 
     // when waterfall() is done all its tasks OR if an error occurred, it will come here 

     // handle error and send response here 
    }); 
}); 
関連する問題