我试图查询解析用户类但我没有得到任何结果。 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?这样我可以在检查完所有电话号码后回复客户端吗?
答案 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
模型的情况下实现相同的功能,但其他人可以引用我。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
上的更多信息一样