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 使用云代码自动填充和更新列的主要内容,如果未能解决你的问题,请参考以下文章

解析云代码迁移后如何更新到最新版本的 Parse-SDK-JS

使用云代码Parse-Server保存jpg文件

Parse-Server 云代码查询不返回所有列

Parse.com 云代码 - 保存后

Parse Server 上的多个云文件

解析云代码之前保存未在更新时运行