解析云代码 - 如何查询用户类

时间:2014-09-11 16:36:41

标签: parse-platform cloud-code

我试图查询解析用户类但我没有得到任何结果。 User类有一个标有" phone"的列,并且我传递了一个字典数组,其中每个字典都有一个键" phone_numbers"对应于一组电话号码。我试图确定我桌上的用户是否有其中一个电话号码。我运行代码时没有出现任何错误,但我的表中确实存在一个匹配电话号码的用户。我做错了什么?

Parse.Cloud.define("hasApp", function(request, response) {
    var dict = request.params.contacts;
    var num = 0;
    var found = 0;
    var error = 0;
    var phoneNumbers = "";
    for (var i = 0; i < dict.length; i++){
        var result = dict[i].phone_numbers;
        num += result.length;
        for (var j = 0; j < result.length; j++){
            phoneNumbers += result[j] + ", ";

            var query = new Parse.Query(Parse.User);

            query.equalTo("phone", result[j]);
            query.find({
              success: function(results) {
              found = 1;
          },
          error: function() {
            error = 1;
          }
          });
        }
    }
    response.success("hasApp " + dict.length + " numbers " + num + " found " + found + " error " + error + " phoneNumbers " + phoneNumbers);
});

我的回复是

hasApp 337 numbers 352 found 0 error 0 phoneNumbers "list of phone numbers" 

其中一些电话号码出现在我的用户类中。据我所知,我没有收到任何错误,但我也没有成功查询用户表

更新

搬家后

response.success("hasApp " + dict.length + " numbers " + num + " found " + found + " error " + error + " phoneNumbers " + phoneNumbers);

到成功块的主体,我得到以下错误,因为我只允许每个云函数调用一次response.success。

Error Domain=Parse Code=141 "The operation couldn’t be completed. (Parse error 141.)"     
UserInfo=0x14d035e0 {code=141, error=Error: Can't call success/error multiple times
    at Object.success (<anonymous>:99:13)
    at query.find.success (main.js:44:12)
    at Parse.js:2:5786
    at r (Parse.js:2:4981)
    at Parse.js:2:4531
    at Array.forEach (native)
    at Object.w.each.w.forEach [as _arrayEach] (Parse.js:1:666)
    at n.extend.resolve (Parse.js:2:4482)
    at r (Parse.js:2:5117)
    at Parse.js:2:4531}

这是否意味着我一次只能验证一个电话号码?所以我无法通过一系列电话号码并获得与这些电话号码相对应的PFUser对象(如果存在)?

据我所知,我对Parse.User的内部查询与我的&#34; hasApp&#34;同步进行。调用,有没有办法异步查询Parse.User?这样我可以在检查完所有电话号码后回复客户端吗?

4 个答案:

答案 0 :(得分:4)

您可以使用Parse.Promise来解决需要在一个异步Cloud Code定义中迭代O(n)个数据库查询的逻辑:

var _ = require("underscore"),
    isEmpty = function (o) { // standard function to check for empty objects
        if (o == null) return true;
        if (o.length > 0)    return false;
        if (o.length === 0)  return true;
        for (var p in o) {
            if (hasOwnProperty.call(o, p)) return false;
        }
        return true;
    };

Parse.Cloud.define("hasApp", function (request, response) {
    var dict = request.params.contacts,
        users = [];

    var promise = Parse.Promise.as();
    _.each(dict, function (obj) {
        _.each(obj.phone_numbers, function (num) {
            promise = promise.then(function () {
                var promiseQuery = new Parse.Query(Parse.User);
                promiseQuery.equalTo("phone", parseInt(num));
                return promiseQuery.find({
                    success: function (result) {
                        if (isEmpty(result)) // don't save empty results e.g., "[]"
                            return;
                        users.push(result); // save results to a model to prevent losing it in scope
                    }
                });
            });
        });
    });
    return promise.then(function () {
        response.success("Found user(s): " + JSON.stringify(users));
    });

});

请注意关于此块的一些事项:

  • 您可以迭代地将功能附加到Parse.Promise
  • 您可以在迭代中放宽数据库结果的范围。使用本地数组模型将查询结果保存到。虽然,我认为有一种更好的方法可以在不使用user模型的情况下实现相同的功能,但其他人可以引用我。
  • 密切关注Parse处理数据的方式。例如,如果您将电话号码存储为number,则必须确保在查询时使用parseInt()

请注意,您必须将response.success()函数附加到您的承诺中,以确保在迭代运行后它已得到解决。在此块中,您对Parse的响应将类似于User个对象的数组。您可以根据需要决定保存数据模型的许多不同方法。

作为最后一点,此块不会解释任何应该考虑的验证或错误处理。

答案 1 :(得分:0)

问题似乎是在查询甚至发生之前发生了response.success调用。虽然在查询成功块中有response.success次调用,但从不调用它们,因为在执行查询之前返回成功。

尝试评论该行:

response.success("hasApp " + dict.length + " numbers " + num + " found " + found + " error " + error + " phoneNumbers " + phoneNumbers);

这应该让代码转到您的查询,并可能将其移动到查询的成功块中。

如果有效,请告诉我。

答案 2 :(得分:0)

您现在正在循环调用response.success。每个云函数只应调用一次response.success / response.error。

如果您可以显示没有注释掉的行(显示您的初衷)的原始代码和没有注释掉的行作为两个单独的代码示例的新代码,将会有所帮助。

答案 3 :(得分:0)

查询Parse.User相当容易,并在文档中做了很好的解释,这里有一个例子

var query = new Parse.Query(Parse.User);
query.equalTo("gender", "female");  // find all the women
query.find({
  success: function(women) {
    // Do stuff
  }
});

对于你的情况,它将是这样的:

Parse.Cloud.define("getAllFemales", function(request, response) {
  var query = new Parse.Query(Parse.User);
    query.equalTo("gender", "female");  // find all the women
    query.find({
      success: function(women) {
        // Do stuff
      }
    });
});

希望它有所帮助,就像Documentation

上的更多信息一样