【问题标题】:node.js synchronously mysql querynode.js 同步 mysql 查询
【发布时间】:2017-06-06 07:15:50
【问题描述】:

我正在使用 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 以 lat-long 路线序列返回我,例如

1)

纬度:12.3456789, 长:12.3456789

2)

纬度:23.1456789, 长:23.1456789

3)

纬度:34.1256789, 长:34.1256789

那么它可能是第一个插入记录 3) 然后可能是插入记录 1) 然后可能是插入记录 2)。

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

请帮帮我。

【问题讨论】:

  • 我认为问题在于您将异步代码与同步代码混合在一起。您的 for 循环的每次迭代都会触发一个 INSERT 查询,并且您直接在回调中使用在 for 循环中创建的 post 对象,因为您的插入查询是异步的,所以无法保证 post 将保持什么值,有无法知道何时执行。

标签: javascript mysql node.js google-maps asynchronous


【解决方案1】:

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

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

  1. 不要在循环中调用插入查询。例如准备一个查询 插入表名(字段 1,字段 2,字段 3)值(val1,val2,val3),(val1,val2,val3),.... 创建这样的查询并执行一次,这将在一次数据库调用中完成,而不是多次
  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);
    });
    

【讨论】:

    猜你喜欢
    • 2013-03-31
    • 2020-08-18
    • 2017-04-08
    • 2023-03-28
    • 2020-11-03
    • 1970-01-01
    • 2018-08-12
    • 2020-10-22
    • 2011-10-02
    相关资源
    最近更新 更多