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

时间:2015-05-21 08:45:54

标签: javascript rest parse-platform cloud-code

我正在解析中创建一个新的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用户中设置参数。我想定义一个私有函数(与上面显示的函数几乎相同)返回该数字,以便我可以在我的其他云函数中调用它,如下所示:

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()返回空。我看到其他人也在私有函数中使用解析对象时遇到问题,我在Parse仪表板中找到了相同的问题而没有回答...... https://parse.com/questions/how-to-define-helper-method-in-cloud-code 谁知道如何实现这一目标?谢谢!

1 个答案:

答案 0 :(得分:2)

这里的问题是query.find以异步方式运行,因此即使查询尚未完成,它也会立即返回。还要记住,您可以在查询上设置的最大限制是1000个对象。

因此,一旦您的用户群增长到这个数字以上,您就必须翻阅结果,这可能需要 n 的时间。由于Cloud Code功能限制为最多运行15秒,这可能会成为后来的问题。

每次创建用户时,只要通过增加对象上的计数器列来跟踪用户数,就可以计算用户数,并在删除用户对象后减少用户数。

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

现在你需要解决同步/异步问题,在这里你可以使用JavaScript Promises链接不同的操作并确保它们在一系列中运行。