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 在单个语句中执行多个查询