繁体   English   中英

node.js 同步 mysql 查询

[英]node.js synchronously mysql query

我正在使用 mySql 数据库在 node.js 中工作。

我正在从 googleMaps sanpToRoad 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();
                });
            });
        }

    }
});

所以,在这里,如果谷歌地图 API 以经纬度路线返回我,如

1)

纬度:12.3456789,长:12.3456789

2)

纬度:23.1456789,长:23.1456789

3)

纬度:34.1256789,长:34.1256789

那么它可能是首先插入记录 3) 然后可能是插入记录 1) 然后可能是插入记录 2)。

所以它会与我的代码冲突,我无法获得正确的地图道路路径。

请帮我。

问题是您的 for 循环将所有请求刷新在一起。 使用此技术您无法控制查询执行流程。

有两种方法可以实现这一点

  1. 不要在循环中调用插入查询。 准备一个查询,例如 INSERT INTO tableName(field1, field2, field3) VALUES(val1,val2,val3), (val1,val2,val3),.... 创建这样的查询并执行它一次这将在一个中完成db 调用而不是许多
  2. 第二种方式是使用异步模块 async.eachSeries 将执行您的查询而不是刷新,这将按顺序输入数据。 检查下面的示例。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM