gpt4 book ai didi

javascript - 使用云代码在 Parse Server 上一次更新和保存数千个对象。代码不适用于 2 个以上的对象。 (解析.Object.saveAll())

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:57 24 4
gpt4 key购买 nike

在我的解析服务器中,我有一个名为 Stats 的类,其中包含列 secondsPlayed (数字)和 timeScore (数字)

我正在使用云代码更新timeScore列中的所有行

下面的代码仅在更新和保存 1 或 2 个对象 results.length 时有效。如果 Parse.Query 返回超过 2 个结果,代码就会崩溃,并且出现以下错误。

error: Failed running cloud function timeScore for user undefined with:
Input: {}
Error: {"code":101,"message":"Object not found."} functionName=timeScore, code=101, message=Object not found., , user=undefined
error: Error generating response. ParseError { code: 101, message: 'Object not found.' } code=101, message=Object not found.
error: Object not found. code=101, message=Object not found.

这是一个问题,因为我需要更新和保存数千个对象。最好和最快的方法是什么?

为什么我的代码适用于 2 个对象,但不适用于 2 个以上的对象?我怎样才能解决这个问题?

这是我的代码

    var _ = require("underscore");

Parse.Cloud.define("timeScore", function(request, response) {

var query = new Parse.Query("Stats");
query.greaterThan("secondsPlayed", 1000);
query.find().then(function(results) {

_.each(results, function(result) {
var secondsPlayed = result.get("secondsPlayed") || 0;
result.set("timeScore", secondsPlayed*2);

});
return Parse.Object.saveAll(results);

}).then(function(results) {

response.success(results);
}, function(error) {

response.error(error);
}); });

这是我的称呼

#!/usr/bin/env node
var Parse = require("parse/node");
Parse.initialize("xx", "xx");
Parse.serverURL = "http://randomapp.herokuapp.com/parse";
Parse.Cloud.run('timeScore');

更新:

下面是我最新的代码。一切正常,除了我无缘无故地收到以下错误。

heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/parse/functions/timeScore

无论我选择什么batchSize,我都会收到超时错误,并且每 30 秒就会收到一次。我一共得到了5次。第五次之后我就不再明白了。我在该过程大约 2.5 分钟(30 秒 * 5)时收到第五个也是最后一个错误。此错误不会以任何方式影响该过程。无论批量大小如何,所有 250k 对象都会更新并保存。

我想也许是因为我从未调用 results.errorresults.success 服务器认为我仍在做一些工作并显示错误。但是我更新了我的代码如下,但仍然出现超时错误。

此外,在每次超时错误之后,processBatch() 都会从头开始再次调用。因为我收到 5 个超时错误,所以 processBatch() 被调用了 5 次。因此,在第 5 个超时错误之后,有 5 个 processBatch() 函数同时运行(我通过日志确认了这一点)。

是什么导致了我遇到的 heroku 超时错误?我该如何修复它?

var _ = require("underscore");
Parse.Cloud.define("timeScore", function(request, response) {
var counter = 0;
function processBatch(query, batchSize, startingAt, process) {
query.limit(batchSize);
query.skip(startingAt);

return query.find().then(results => {

return process(results).then(() => results.length);
}).then(length => {

return (length === batchSize)? processBatch(query, batchSize, startingAt+length, process) : {};
});
}

function setTimeScores(stats) {
console.log("LENGTH " + stats.length);
_.each(stats, stat => {

counter ++;
stat.set("timeScore", counter);

});
return Parse.Object.saveAll(stats);
}

var query = new Parse.Query("Stats");

processBatch(query, 2500, 0, setTimeScores).then(results => {
response.success(results);
}).catch(error => {
response.error(error);
});

});

最佳答案

要处理大于最大查询限制的对象数量,请构建一个更抽象的函数,该函数使用查询的 limit()skip() 来游标浏览数据:

function processBatch(query, batchSize, startingAt, process) {
query.limit(batchSize);
query.skip(startingAt);
return query.find().then(results => {
return process(results).then(() => results.length);
}).then(length => {
return (length === batchSize)? processBatch(query, batchSize, startingAt+length, process) : {};
});
}

这就是说,获取由 query 指定的一批 batchSize 长对象,然后对检索到的对象执行某些操作,然后,如果可能有更多对象,则再次执行相同的操作,跳过我们已经处理过的对象。

您的流程步骤如下所示:

function setTimeScores(stats) {
_.each(stats, stat => {
var secondsPlayed = stat.get("secondsPlayed") || 0;
stat.set("timeScore", secondsPlayed*2);
});
return Parse.Object.saveAll(stats);
}

这样调用它:

let query = new Parse.Query("Stats");
query.greaterThan("secondsPlayed", 1000);
processBatch(query, 100, 0, setTimeScores);

编辑在云函数的上下文中,像这样调用它......

Parse.Cloud.define("computeStats", function(request, response) {
let query = new Parse.Query("Stats");
query.greaterThan("secondsPlayed", 1000);
processBatch(query, 100, 0, setTimeScores).then(results => {
response.success(results);
}).catch(error => {
response.error(error);
});
});

关于javascript - 使用云代码在 Parse Server 上一次更新和保存数千个对象。代码不适用于 2 个以上的对象。 (解析.Object.saveAll()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50991523/

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