在我的云代码中,我想用新数据更新我的所有记录,大约50k。 但我注意到即使我遵循1000条记录限制,我的工作仍然失败。 我为此作业成功/错误未被调用错误。 任何想法如何解决这个问题?
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);
});
答案 0 :(得分:1)
基本上在云架构中,请求超时时间大约是 60秒,但是您尝试在一个事务中插入数千个记录,这需要超过60秒,这就是你的请求总是失败的原因。
有更好的方法可以插入更多的记录,
我认为任务队列更适合您的问题。 观看此视频,您可以了解任务队列
答案 1 :(得分:0)
解决方法:您可以按照可接受的少量记录安排一个cron作业,受限于您拥有的托管服务限制。例如,如果您每分钟只能处理10个请求,则首先请求所有需要更新的ID,然后将它们拆分为服务器将在时间限制内接受和处理的块。这只是一种解决方法。
长期:更好的解决方案是设计您的应用程序,以便从服务器请求尽可能少的数据,而不是强迫服务器完成所有繁重的工作。这也允许您的业务逻辑通过方便的公共API公开,而不是作为服务器上的隐藏进程。