1

我正在尝试查询 Parse User Class,但没有得到任何结果。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 的内部查询与我的“hasApp”调用同步发生,那么有没有办法异步查询 Parse.User?这样我可以在检查所有电话号码后回复客户吗?

4

4 回答 4

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 处理数据的方式。例如,如果您将电话号码存储为numbers,则必须确保parseInt()在查询时使用它。

请注意,您必须将您的response.success()函数附加到您的 Promise 中,以确保它在您的迭代运行后得到解决。从此块中,您从 Parse 的响应看起来类似于User对象数组。您可以根据自己的需要决定保存数据模型的多种不同方式。

最后一点,此块不考虑任何其他应考虑的验证或错误处理。

于 2015-05-27T18:20:43.030 回答
0

问题似乎是您的response.success电话甚至在查询发生之前就已经发生了。虽然您response.success在查询成功块中有调用,但它们永远不会被调用,因为您在查询执行之前返回成功。

尝试注释掉这一行:

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

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

让我知道这个是否奏效。

于 2014-09-11T19:32:10.917 回答
0

You're now calling response.success in a loop now. You should only call response.success/response.error once per cloud function.

It would help if you can show the original code with no commented out lines (to show your original intention) and the new code with no commented out lines as two separate code samples.

于 2014-09-12T10:44:34.597 回答
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
      }
    });
});

希望它有所帮助,一如既往地在文档中提供更多信息

于 2015-07-02T15:03:31.317 回答