2017-01-21 2 views
1

Ich arbeite in node.js mit mySql-Datenbank.node.js synchron mysql Abfrage

ich bin Abrufen lat lange Strecken von googlemaps sanpToRoad Api und diese Daten in meine Tabelle einfügen, aber es ist nicht in Fluss (Sequenz)

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

    } 
}); 

So eingefügt, hier, wenn Google Maps API mich zurück in lat-lang~~POS=TRUNC-Sequenz wie

1)

lat: 12,3456789, lang: 12,3456789

2)

lat: 23,1456789, lang: 23,1456789

3)

lat: 34,1256789, lang: 34,1256789

dann kann es erste Datensatz einfügen 3) werden dann Datensatz eingefügt werden kann, 1) kann dann Datensatz 2) eingefügt werden.

so wird es meinen Code in Konflikt geraten und ich kann nicht richtig fließen der Karte Straße Weg.

bitte helfen Sie mir.

+0

ich glaube, das Problem ist, dass Sie Asynchron-Code mit sync eines mischen. Jede Iteration Ihrer for-Schleife löst eine INSERT-Abfrage aus und Sie verwenden das post-Objekt, das in for loop direkt im Callback erstellt wurde. Es gibt keine Garantie, welche Werte post enthält, da Ihre insert-Abfrage dort async ist ist keine Möglichkeit zu wissen, wann es ausgeführt wird. – abhishekkannojia

Antwort

0

Problem ist Ihre for-Schleife bündig alle Anfragen zusammen. Mit dieser Technik können Sie den Ablauf der Abfrageausführung nicht steuern.

Es gibt zwei Möglichkeiten, diese

  1. Dont Anruf INSERT-Abfrage in einer Schleife zu erreichen. eine Abfrage vorbereiten zum Beispiel INSERT INTO Tabellenname (Feld1, Feld2, Feld3) WERTE (val1, val2, val3), (val1, val2, val3), .... erstellen Abfrage wie folgt und führen Sie es einmal aus, dies wird es tun in einem db Anruf anstelle von vielen
  2. Zweite Möglichkeit ist, Async-Modul async.eachSeries wird führen Sie abfragen nacheinander statt Spülen und dies wird Daten nacheinander eingeben. Überprüfen Sie das Beispiel unten.

    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

Sie sind toller Bruder ... –

Verwandte Themen