解析服务器使用云代码自动填充和更新列
Parse Server populating and updating a column automatically with cloud code
我有一个名为 Stats
的 class,其中包含列 secondsPlayed
(数字)、createdAt
(日期)和 timeScore
(数字)
此 class 包含数千个对象,但 timeScore
列为空。
我想使用 secondsPlayed
(数字)、createdAt
(日期)列的公式填充 timeScore
列,就像您在 Excel 中所做的那样。公式为:
(secondsPlayed*10^8)/(Date.now()-createdAt.getTime())
如您所见,timeScore
列的值应该每秒更改一次,因为 Date.now()
和 secondsPlayed
是不断变化的变量。
因此,我想每 5 分钟更新并重新填充一次 timeScore
列。这应该会自动发生。
最好的方法是什么?我认为使用云代码计算和填充 timeScore
列,然后使用简单的 Parse 查询获取 timeScore
列表,这与将数千个对象下载到每个设备并每 5 次计算和更新相比是最好的分钟客户端。
我不太了解编写云代码,但通过阅读 this guide and 我想出了以下代码。
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
列。这可能吗?
要从 .net 客户端进行测试,ParseCloud
提供 CallFunctionAsync
。 See the guide for an example here。
您会发现代码中至少有一个问题是查询最多 return 1k 个对象,因此 query/update/save 逻辑将不得不游标每个 Stats
个对象时间这个 运行s.
测试完成后,您需要创建一个网络工作者,Heroku 会让您安排它。 See their guide about that here.
但我不愿意就这些要点进一步详细说明,因为我不同意这个问题的前提:应该完成或定期完成此更新。
请考虑 运行使用此代码不会向系统添加任何新信息。 createdAt
字段保持不变。这段代码所做的只是产生一种奇怪的方式来表示当前时间(作为创建时间和此后的间隔)每 运行 数千次。这正是只有在需要为给定对象知道该间隔(现在 - createdAt)时才应该做的事情。
我有一个名为 Stats
的 class,其中包含列 secondsPlayed
(数字)、createdAt
(日期)和 timeScore
(数字)
此 class 包含数千个对象,但 timeScore
列为空。
我想使用 secondsPlayed
(数字)、createdAt
(日期)列的公式填充 timeScore
列,就像您在 Excel 中所做的那样。公式为:
(secondsPlayed*10^8)/(Date.now()-createdAt.getTime())
如您所见,timeScore
列的值应该每秒更改一次,因为 Date.now()
和 secondsPlayed
是不断变化的变量。
因此,我想每 5 分钟更新并重新填充一次 timeScore
列。这应该会自动发生。
最好的方法是什么?我认为使用云代码计算和填充 timeScore
列,然后使用简单的 Parse 查询获取 timeScore
列表,这与将数千个对象下载到每个设备并每 5 次计算和更新相比是最好的分钟客户端。
我不太了解编写云代码,但通过阅读 this guide and
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
列。这可能吗?
要从 .net 客户端进行测试,ParseCloud
提供 CallFunctionAsync
。 See the guide for an example here。
您会发现代码中至少有一个问题是查询最多 return 1k 个对象,因此 query/update/save 逻辑将不得不游标每个 Stats
个对象时间这个 运行s.
测试完成后,您需要创建一个网络工作者,Heroku 会让您安排它。 See their guide about that here.
但我不愿意就这些要点进一步详细说明,因为我不同意这个问题的前提:应该完成或定期完成此更新。
请考虑 运行使用此代码不会向系统添加任何新信息。 createdAt
字段保持不变。这段代码所做的只是产生一种奇怪的方式来表示当前时间(作为创建时间和此后的间隔)每 运行 数千次。这正是只有在需要为给定对象知道该间隔(现在 - createdAt)时才应该做的事情。