gpt4 book ai didi

javascript - Node - mysql 查询在完成原始查询之前几分钟后重复自身

转载 作者:行者123 更新时间:2023-11-29 00:26:29 25 4
gpt4 key购买 nike

我正在构建一个带有 Angular 和 Node 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);
}
});
});
};

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

  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("进入创作法庭");

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

我不知道是什么触发了createCourts函数一次又一次。

可能是因为 UI 进入超时状态,因此如果在 1 分钟(或接近 1 分钟)后仍未收到答复,则会再次触发服务。如果这是我如何告诉服务等待答案的原因?

最佳答案

考虑异步 api:在服务器处理程序上立即响应 HTTP 200 和一些 id,还有另一个端点检查是否插入带有 id 的命令完成。

请注意,您的代码容易受到 sql 注入(inject)攻击。更好的方法:

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 行/秒。尝试将惰性调用替换为生成大型插入查询文本并使用控制台客户端进行测试。如果仍然需要几分钟,则问题不在 Node 领域,您需要优化数据库。

关于javascript - Node - mysql 查询在完成原始查询之前几分钟后重复自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18676088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com