在 CloudCode 私有函数中使用 Parse 对象

Using Parse objects in CloudCode private function

我正在 parse 中创建一个新的 CloudCode 函数来检索数据库中的用户总数。我通过这样做设法实现了这一目标:

    Parse.Cloud.define("getUsers", function(request, response) {
    var users = Parse.Object.extend("_User");
    var query = new Parse.Query(users);

    query.find({
        success: function(numberOfUsers) {
        response.success(numberOfUsers.length);
  },
    error: function(error) {
        alert("Error: " + error.code + " " + error.message);
    }
});
});

现在,我想使用用户总数在我的 Parse User 中设置一个参数。我想定义一个私有函数(与上面显示的函数几乎相同)returns 那个数字,这样我就可以在我的其他云函数中调用它,如下所示:

Parse.Cloud.define("signUp", function(request, response) {
    var user = new Parse.User();
    user.set("username", request.params.username);
    user.set("password", request.params.password);

    //setting empty fields
    ...
    user.set("alias", "user#" + numberOfUsers());

    user.signUp(null, {
    success: function(user) {
        response.success(user);
    },
    error: function(user, error) {
        alert("Error: " + error.code + " " + error.message);
  }
});
});

function numberOfUsers() {
    var users = Parse.Object.extend("_User");
    var query = new Parse.Query(users);

    query.find({
        success: function(numberOfUsers) {
        return numberOfUsers.length;
  },
    error: function(error) {
        return 0;
    }
});
}

但由于某些原因这不起作用。函数 numberOfUsers() returns 为空。我看到其他一些人在私有函数中使用解析对象也有问题,我在解析仪表板中发现了同样的问题但没有答案... https://parse.com/questions/how-to-define-helper-method-in-cloud-code 任何人都知道如何实现这一目标?谢谢!

这里的问题是 query.find 运行 是异步的,因此即使查询尚未完成,它也会立即 return 。另请记住,您可以为查询设置的最大限制是 1000 个对象。

因此,一旦您的用户群增长超过这个数字,您将不得不翻阅结果,这可能需要 n 时间。由于 Cloud Code 功能被限制为 运行 最多 15 秒,这在以后可能会成为一个问题。

您可以通过在每次创建用户时增加对象的计数器列并在删除用户对象时减少它来跟踪用户数量,而不是每次都对用户进行计数。

您可以在此处使用 afterSaveafterDelete 挂钩,更新计数器列,在您的 getUsers 函数中,您只需 return 该列的值。

现在你需要绕过 sync/async 问题,在这里你可以使用 JavaScript Promise 来链接不同的操作并确保它们 运行 在一个系列中。