2017-01-21 10 views
1

私はmySqlデータベースでnode.jsに取り組んでいます。node.js synchronously mysql query

Google MapsのAPIが私を返す場合、私はここで、だから、(シーケンス)

var pool = mysql.createPool({ 
    connectionLimit : 10, 
    host   : 'localhost', 
    user   : 'root', 
    password  : '', 
    database  : 'myTestDb' 
}); 


var googleAPILink = 'https://roads.googleapis.com/v1/snapToRoads?path='+lastLat+','+lastLong+'|'+currentLat+','+currentLong+'&interpolate=true&key=GOOGLE_MAP_KEY'; 

console.log(googleAPILink); 

var roadResponse = request(googleAPILink, function (error, response, body) { 

    if (!error && response.statusCode == 200) { 

     responseData = JSON.parse(body); 


     for(i = 0; i < responseData.snappedPoints.length; i++) { 

      var locationArrayObject = responseData.snappedPoints[i]; 

      var locationArrayObjectInsider = (locationArrayObject.location); 

      var roadLat = locationArrayObjectInsider.latitude; 

      var roadLong = locationArrayObjectInsider.longitude 

      var rideStatus = rows2[0].status; 

      var rideStartedAns = 'n'; 

      if(rideStatus == 's') 
      { 
       rideStartedAns = 'y' 
      } 



      var post = { 
          tripid: rideId, 
          latitude: roadLat, 
          road_longitude: roadLong, 
          rideStarted: rideStartedAns, 
          routeRideCounter: routeCounter, 
          status: 'y' 
         }; 



      pool.getConnection(function(err, connectDB4) { 

       var qry = connectDB4.query('INSERT INTO tbl_rout SET ?', post, function(err5, result5) { 
        console.log(qry.sql); 
        connectDB4.release(); 
       }); 
      }); 
     } 

    } 
}); 

をGOOGLEMAPS sanpToRoad APIからLAT-長いルートをフェッチし、私のテーブルにそのデータを挿入するが、それは流れの中に挿入されていないですよ

1のようにLAT-長いルートシーケンス)LAT

:12.3456789、 長:12.3456789

2)

緯度:23.1456789、 長:23.1456789

3)

緯度:34.1256789、 長:34.1256789

それは第1のインサートレコード3とすることができるであろう)は、レコード1を挿入することができます)は、レコード2を挿入することができます。

これは私のコードと競合し、私は地図道路の道の適切な流れを得ることができません。

私を助けてください。

+0

私はこの問題は、あなたが同期のものと非同期コードを混合していると思います。あなたのforループの各反復は 'INSERT'クエリを起動していて、コールバックでforループで直接生​​成された' post'オブジェクトを使用していますので、挿入クエリが非同期であるために 'post'が保持する値は保証されません。それがいつ実行されるかを知る方法はありません。 – abhishekkannojia

答えて

0

問題は、すべてのリクエストをまとめてフラッシュするforループです。この手法を使用すると、クエリの実行フローを制御することができなくなります。

ループでこの

  1. いけないコールINSERTクエリを達成するには、2つの方法があります。たとえば、 INSERT INTO tableName(field1、field2、field3)VALUES(val1、val2、val3)、(val1、val2、val3)などのクエリを準備します。 このようなクエリを作成して実行します。
  2. 第2の方法は、非同期モジュールを使用することです。 async.eachSeriesは、フラッシングの代わりに1つずつクエリを実行し、これはデータを順番に入力します。以下の例を確認してください。

    do npm install async --save 
    
        var async = require('async'); 
    
        async.eachSeries(responseData.snappedPoints , function(snappedPoint , cb){ 
        var locationArrayObject = snappedPoint; 
    
        var locationArrayObjectInsider = (locationArrayObject.location); 
    
        var roadLat = locationArrayObjectInsider.latitude; 
    
        var roadLong = locationArrayObjectInsider.longitude 
    
        var rideStatus = rows2[0].status; 
    
        var rideStartedAns = 'n'; 
    
        if(rideStatus == 's') 
        { 
         rideStartedAns = 'y' 
        } 
    
    
    
        var post = { 
            tripid: rideId, 
            latitude: roadLat, 
            road_longitude: roadLong, 
            rideStarted: rideStartedAns, 
            routeRideCounter: routeCounter, 
            status: 'y' 
           }; 
    
    
    
        pool.getConnection(function(err, connectDB4) { 
    
         var qry = connectDB4.query('INSERT INTO tbl_rout SET ?', post, function(err5, result5) { 
          console.log(qry.sql); 
          connectDB4.release(); 
          cb(); 
         }); 
        }); 
    }, function(){ 
        console.log('execuation completed); 
    }); 
    
+1

あなたは素晴らしい兄弟です... –