node.js 同步 mysql 查询

Posted

技术标签:

【中文标题】node.js 同步 mysql 查询【英文标题】:node.js synchronously mysql query 【发布时间】: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 将保持什么值,有无法知道何时执行。 【参考方案1】:

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

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

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

    第二种方法是使用异步模块 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);
    );
    

【讨论】:

以上是关于node.js 同步 mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 postgres 和 node js 在单个语句中执行多个查询

Node.js log4j-like 日志系统

平安产险项目记录

在 Node.js 中进行同步 MongoDB 查询的正确方法是啥?

带你从零学Node.js

node.js 1