【问题标题】:Parse Server populating and updating a column automatically with cloud codeParse Server 使用云代码自动填充和更新列
【发布时间】: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 guidethis 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 列。这可能吗?

【问题讨论】:

    标签: javascript heroku parse-platform parse-server parse-cloud-code


    【解决方案1】:

    要从 .net 客户端进行测试,ParseCloud 提供了CallFunctionAsyncSee 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()) 可以是几个月甚至几年。每秒运行代码是没有意义的。但如果它不会产生任何负面影响,我可能会这样做。
    猜你喜欢
    • 2020-06-13
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多