node – mysql查询,在完成原始查询之前几分钟后需要几分钟重复

我正在构build一个angular度和节点js的应用程序。 我有一个非常大的查询(插入查询)插入的东西像30,000行由于某种原因需要几分钟(我想它的确定)。

这是我的查询:

this.createCourts = function (req, res, next){ console.log("entered creation courts"); connection.query('CALL filldates("' + req.body['startDate'] + '","' + req.body['endDate'] + '","' + req.body['numOfCourts'] + '","' + req.body['duration'] + '","' + req.body['sundayOpen'] + '","' + req.body['mondayOpen'] + '","' + req.body['tuesdayOpen'] + '","' + req.body['wednesdayOpen'] + '","' + req.body['thursdayOpen'] + '","' + req.body['fridayOpen'] + '","' + req.body['saturdayOpen'] + '","' + req.body['sundayClose'] + '","' + req.body['mondayClose'] + '","' + req.body['tuesdayClose'] + '","' + req.body['wednesdayClose'] + '","' + req.body['thursdayClose'] + '","' + req.body['fridayClose'] + '","' + req.body['saturdayClose'] + '");', function(err, result, fields){ if (err){ console.log("error is" + err); return res.send(500, "fail"); } else{ console.log("finsihed"); return res.send(200); } }); }); }; 

我的用户界面会点击一个button,这将触发一个这样的服务:

  CourtsService.createCourts.save({}, {"startDate": dateService.Date_toYMD($scope.startDate), "endDate": dateService.Date_toYMD($scope.endDate), "numOfCourts": $scope.numOfCourts, "duration": $scope.duration, "sundayOpen": $scope.sundayOpen.hour, "mondayOpen": $scope.mondayOpen.hour, "tuesdayOpen": $scope.tuesdayOpen.hour, "wednesdayOpen": $scope.wednesdayOpen.hour, "thursdayOpen": $scope.thursdayOpen.hour, "fridayOpen": $scope.fridayOpen.hour, "saturdayOpen": $scope.saturdayOpen.hour, "sundayClose": $scope.sundayClose.hour, "mondayClose": $scope.mondayClose.hour, "tuesdayClose": $scope.tuesdayClose.hour, "wednesdayClose": $scope.wednesdayClose.hour, "thursdayClose": $scope.thursdayClose.hour, "fridayClose": $scope.fridayClose.hour, "saturdayClose": $scope.saturdayClose.hour}, function(data){ $scope.showSearching = false; $dialog.messageBox("success", btns).open(); }, function(err){ $scope.showSearching = false; $dialog.messageBox("fail", err.data, btns).open(); }); 

我将这一行添加到实际执行查询的函数的第一行(其代码在这里)console.log(“进入创build法庭”);

我的问题是,因为查询运行几分钟(可能是10分钟),似乎我的function被一次又一次地调用,因为我可以在控制台中看到大约每1分钟一行“进入创build法庭”这当然不是我想要发生的事情。

我不知道一次又一次触发createCourts函数。

也许是因为界面进入超时状态,如果在1分钟之后没有收到答案(或者接近那个答案),就会再次触发服务。 如果这是我如何告诉服务等待答案的原因?

考虑asynchronousAPI:在服务器处理程序立即响应HTTP 200和一些ID,还有另一个端点来检查是否完成插入命令与ID。

请注意,您的代码容易发生SQL注入攻击。 更好的方法:

 var params = req.body; // you may want to filter names explicitly here connection.query('CALL filldates(?,?,?,?,...)', params, function(err, result, fields){ if (err){ console.log("error is" + err); return res.send(500, "fail"); } else{ console.log("finsihed"); return res.send(200); } }); 

这可以在发送查询之前转义客户端上的所有危险字符,或者使用mysql2的准备语句发送独立于参数的查询:

 var params = req.body; // you may want to filter names explicitly here connection.execute('CALL filldates(?,?,?,?,...)', params, function(err, result, fields){ if (err){ console.log("error is" + err); return res.send(500, "fail"); } else{ console.log("finsihed"); return res.send(200); } }); 

“几分钟”恕我直言,是太多了,在我的基准,我已经插入速度大约10K行/秒。 尝试用生成的大插入查询文本代替惰性呼叫,并用控制台客户端进行testing。 如果仍然需要几分钟,那么问题不在节点土地,您需要优化您的数据库。