Javascript 如何在解析云代码中保存批量数据?
在我的云代码中,我想用一个新数据更新我的所有记录,大约50k。 但我注意到我的工作失败了,尽管我遵守了1000条记录的限制。 我得到的此作业的成功/错误未被称为错误。 你知道我该怎么解决这个问题吗Javascript 如何在解析云代码中保存批量数据?,javascript,parse-platform,cloud,parse-cloud-code,Javascript,Parse Platform,Cloud,Parse Cloud Code,在我的云代码中,我想用一个新数据更新我的所有记录,大约50k。 但我注意到我的工作失败了,尽管我遵守了1000条记录的限制。 我得到的此作业的成功/错误未被称为错误。 你知道我该怎么解决这个问题吗 Parse.Cloud.job("hello", function(request, response) { Parse.Cloud.useMasterKey(); var results = []; var limit = 1000; var saveUpdatedQueries = func
Parse.Cloud.job("hello", function(request, response) {
Parse.Cloud.useMasterKey();
var results = [];
var limit = 1000;
var saveUpdatedQueries = function(queries) {
console.log("updating records " + queries.length);
Parse.Object.saveAll(queries,{
success:function(lists){
console.log("lists ok "+lists.length);
if (!results.length) {
response.success("finished");
return;
}
updatingRecords(lists.length);
},error: function(reason){
console.log("error");
}
});
}
var updatingRecords = function(skip) {
var tempRecords = [];
if (skip) {
results = results.slice(skip);
}
console.log("skip: " + skip + " Results length: "+ results.length);
for (var i = 0; i < results.length; i++) {
var today = new Date();
var newObject = results[i];
newObject.set('newCulumn', today);
tempRecords.push(newObject);
if (i === results.length - 1 || tempRecords.length === limit) {
break;
};
};
saveUpdatedQueries(tempRecords);
}
var processCallback = function(res) {
results = results.concat(res);
if (res.length === limit) {
process(res[res.length - 1].id);
return;
}
updatingRecords(0);
}
var process = function(skip) {
var query = new Parse.Query(Parse.Installation);
if (skip) {
query.greaterThan("objectId", skip);
}
query.limit(limit);
query.ascending("objectId");
query.find().then(function querySuccess(res) {
processCallback(res);
}, function queryFailed(reason) {
if (reason.code == 155 || reason.code == 141) { // exceeded parse timout
console.log("time out error");
process(skip);
} else {
response.error("query unsuccessful, length of result " + results.length + ", error:" + reason.code + " " + reason.message);
}
});
}
process(false);
});
Parse.Cloud.job(“hello”,函数(请求、响应){
Parse.Cloud.useMasterKey();
var结果=[];
var限值=1000;
var saveUpdatedQueries=函数(查询){
log(“更新记录”+查询.length);
Parse.Object.saveAll(查询、{
成功:功能(列表){
log(“lists ok”+lists.length);
如果(!results.length){
回答:成功(“完成”);
返回;
}
更新记录(列表长度);
},错误:函数(原因){
控制台日志(“错误”);
}
});
}
var updateingrecords=函数(跳过){
var tempRecords=[];
如果(跳过){
结果=结果切片(跳过);
}
日志(“跳过:+skip+”结果长度:+Results.length);
对于(var i=0;i
解决方法:您可以按可接受的较低记录数批量安排cron作业,受托管服务限制。例如,如果每分钟只能处理10个请求,则首先请求需要更新的所有ID,然后将其拆分为服务器将接受并在时间限制内处理的块。这只是一个解决办法
长期:更好的解决方案是将应用程序设计为从服务器请求尽可能少的数据,而不是强迫服务器完成所有繁重的工作。这还允许通过方便的公共API公开您的业务逻辑,而不是将其作为隐藏进程放在服务器上。基本上在云架构中,请求超时时间约为60秒,但您尝试在一个事务中插入超过数千条记录,这需要60多秒,这就是为什么您的请求总是失败的原因 有更好的方法插入更多的记录
你为什么不使用承诺?@MoNazemi我尝试过使用saveAll Promises,但仍然得到相同的结果。它失败了吗?超时了吗?作业将在15秒后被削减…如果您每分钟发出1800个以上的请求,您将达到免费计划限制。在应用程序中嵌入保留(例如1/3/7天不活动)推送,而不是使用解析,这是一个很好的做法。您的应用程序确切知道上次启动是什么时候,您可以避免在处理时间和推送接收时间之间向启动您的应用程序的用户发送通知。对于android,您可以使用。iOS和Windows也应该支持类似的功能。