2014-09-11 3 views
1

Parse User Class를 쿼리하려고하는데 결과가 없습니다. User 클래스에는 "phone"이라고 표시된 열이 있으며 각 사전에 전화 번호 배열에 해당하는 "phone_numbers"키가있는 사전 배열을 전달합니다. 내 테이블의 사용자에게 해당 전화 번호 중 하나가 있는지 확인하려고합니다. 코드를 실행하는 데 오류가 발생하지 않지만 일치하는 전화 번호가있는 테이블에 사용자가 존재합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이 전화에서Parse Cloud Code - 사용자 클래스를 쿼리하는 방법

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" 

입니다. 지금까지 내가 오류를받지 못했습니다하지만 나는 또한 성공적으로 사용자 테이블

UPDATE 질의 아니에요 말할 수

성공 블록의 몸에

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를 비동기 적으로 쿼리하는 방법이 있습니까? 그렇게하면 모든 전화 번호를 확인한 후 클라이언트에게 응답 할 수 있습니까?

답변

0

쿼리가 발생하기 전에 response.success 호출이 발생하는 것 같습니다. 쿼리 성공 블록에서 response.success 호출이있는 동안 쿼리가 실행되기 전에 성공을 반환하기 때문에 호출되지 않습니다.

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

이 코드는 쿼리에 가자, 어쩌면 쿼리의 성공 블록으로 이동해야합니다

라인을 주석보십시오.

이 기능이 작동하는지 알려주세요.

+0

내 쿼리의 성공 블록으로 해당 라인을 이동하면 오류가 발생합니다. 모든 전화 번호를 확인하기 전까지 응답을 연기 할 수 있습니까? – josealvarado111

+0

질문을 최신 코드로 업데이트 할 수 있습니까? 현재 실행중인 시도를 두 번 시도해보기가 어렵습니다. – BHendricks

0

이제 루프에서 response.success가 호출됩니다. 클라우드 기능 당 한 번만 response.success/response.error를 호출해야합니다.

주석 처리 된 행이없는 원본 코드 (원래 의도를 보여주기 위해)와 주석 처리 된 행이없는 새 코드를 두 개의 별도 코드 샘플로 표시 할 수 있다면 도움이됩니다.

+0

코드를 업데이트하고 주석을 제거했습니다. 비동기식 내부 쿼리를 수행하는 방법이 있습니까? – josealvarado111

+0

여기서는 containedIn 쿼리 제약 조건을 사용하여 전화 번호 하나당 하나의 쿼리 만 필요로합니다. https://www.parse.com/docs/js_guide#queries-constraints 다음과 같이 입력하십시오. query.containedIn ("phone", arrayOfAllPhoneNumbers); 원래 코드의 문제점은 쿼리가 비동기 적으로 발생하고 루프가 종료 되 자마자 response.success가 호출된다는 점입니다. 전화 번호당 하나의 쿼리에 만족하면 모든 발견이 완료되면 해결되는 약속을 만들 수 있습니다. https://www.parse.com/docs/js_guide#promises-parallel – boinged

4

당신이 O를 ​​반복 할 필요가 어디 논리를 해결하기 위해 Parse.Promise을 사용할 수 (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 개체의 배열과 비슷하게 보입니다. 필요한 것에 따라 데이터 모델을 저장할 수있는 여러 가지 방법을 결정할 수 있습니다.

마지막으로이 블록은 다른 방법으로 설명되어야하는 유효성 검사 또는 오류 처리를 설명하지 않습니다.

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 
     } 
    }); 
}); 

하십시오 Parse.User 쿼리

0

는 여기에 당신의 사건을 위해 그것은

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

에서 가져온 예는 이런 일이 될 것입니다, 매우 쉽게 잘 문서에 설명되어 있습니다 항상 도움이되기를 바랍니다. Documentation