Parse Server 使用云代码自动填充和更新列
Posted
技术标签:
【中文标题】Parse Server 使用云代码自动填充和更新列【英文标题】:Parse Server populating and updating a column automatically with cloud code 【发布时间】:2018-06-03 18:13:25 【问题描述】:我有一个名为Stats
的类,其中包含secondsPlayed
(编号)、createdAt
(日期)和timeScore
(编号)列
此类包含数千个对象,但 timeScore
列是空的。
我想用公式填充timeScore
列,该公式使用列secondsPlayed
(数字)、createdAt
(日期),就像您在 Excel 中所做的那样。公式为:
(secondsPlayed*10^8)/(Date.now()-createdAt.getTime())
正如您所见,timeScore
列的值应该每秒都在变化,因为 Date.now()
和 secondsPlayed
是不断变化的变量。
因此,我想每 5 分钟更新和重新填充一次 timeScore
列。这应该会自动发生。
最好的方法是什么?我认为使用云代码计算和填充 timeScore
列,然后通过简单的 Parse 查询获取 timeScore
列表,这与将数千个对象下载到每个设备并每 5 分钟计算和更新一次客户端相比是最好的。
我不太了解编写云代码,但通过阅读this guide 和this SO question,我想出了以下代码。
const _ = require("underscore");
Parse.Cloud.define("timeScore", function(request, response)
const query = new Parse.Query("Stats");
const maxSeconds = (Date.now() - new Date('2017-12-12T06:00:04.022Z').getTime())/1000;
query.lessThan("secondsPlayed", maxSeconds);
query.find().then(function(results) =>
_.each(results, function(result)
var secondsPlayed = result.get("secondsPlayed") || 0;
var createdAt = result.get("createdAt") || new Date('2017-12-12T06:00:04.022Z');
result.set("timeScore", (secondsPlayed*100000000)/(Date.now()-createdAt.getTime()));
);
return Parse.Object.saveAll(results);
).then(function(results)
response.success(results);
, function(error)
response.error(error);
)
.catch(() =>
response.error("FAILED");
);
);
我不知道如何处理这段代码。我不知道如何测试它,或者它是否有效。我应该如何进行?
我需要从 xamarin 应用程序调用它吗?我只需要根据代码每 5 分钟填充和更新该列。我不需要从应用程序调用云代码。我只想从应用程序中查询timeScore
列。这可能吗?
【问题讨论】:
【参考方案1】:要从 .net 客户端进行测试,ParseCloud
提供了CallFunctionAsync
。 See the guide for an example here。
您会发现代码的至少一个问题是查询最多会返回 1k 个对象,因此每次运行时查询/更新/保存逻辑都必须在 Stats
对象上进行游标。
测试后,您需要创建一个 Web Worker,Heroku 会让您安排该工作。 See their guide about that here.
但我不愿意就这些问题中的任何一点进行更详细的说明,因为我不同意这个问题的前提:这个更新应该进行,或者经常进行。
请考虑运行此代码不会向系统添加新信息。 createdAt
字段保持不变。这段代码所做的只是产生一种奇怪的方式来表示当前时间(作为 createdAt 时间和从那时起的时间间隔),每次运行数千次。这正是只有在需要知道给定对象的间隔(现在 - createdAt)时才应该做的事情。
【讨论】:
您好,谢谢您的回答。我不明白为什么需要从客户端测试或运行代码。我只想使用 A 列和 B 列填充 C 列。我没有向客户端返回数据,我所做的与客户端无关。无论如何都可以运行代码而不从客户端调用它?我实际上不需要查询,因为我确实希望填充 C 列的每一行。所以我需要在每个对象上运行代码。我还会有1k的问题吗? 我计算的是你在游戏中的分数。如果用户没有在玩(secondsPlayed)没有改变但时间在流逝(Date.now()-createdAt.getTime()),用户的分数会降低。我需要每 5 分钟更新一次用户分数。 用户如何以及何时看到她的分数?这就是我对何时何地进行此计算的看法。考虑一下:如果服务器端作业每 5 分钟运行一次,那么在任何给定时刻,每个人的分数平均会错 2.5 分钟。 抱歉,顺便说一句,关于客户致电的混淆。我误解了“我需要从 xamarin 应用程序调用它吗?”这一行。作为关于如何从 .NET 客户端调用它的问题。您可以只托管并使用 cron 来进行定期调用。 Heroku 的版本是“预定工作者”。至于在没有客户端/用户最终得到结果的情况下运行它,请参阅en.wikipedia.org/wiki/If_a_tree_falls_in_a_forest 嗨,用户每次打开高分屏幕都会看到他们的分数。如果我可以填充 C 列服务器端,客户端将使用简单的解析查询来查看数据,该查询将显示 C 列的前 100 个值。分数四舍五入到最接近的整数,因此 5 分钟实际上不会影响分数,因为 ( Date.now()-createdAt.getTime()) 可以是几个月甚至几年。每秒运行代码是没有意义的。但如果它不会产生任何负面影响,我可能会这样做。以上是关于Parse Server 使用云代码自动填充和更新列的主要内容,如果未能解决你的问题,请参考以下文章