2015-10-06 2 views
0

У меня есть пользовательский класс с двумя типами пользователей - клиентами и поставщиками. Существует столбец (GeoPoint), называемый vendorLocation в таблице пользователя, который имеет координаты магазина поставщика, но остается пустым (null) для клиентов.Использование геолокации в Cloud Cloud Code

Когда заказчик размещает заказ, в классе заказа создается новый объект, в котором я храню адресное местоположение в виде GeoPoint. Я хочу найти ближайшего к нему продавца. Я попытался написать код облака, но продолжал сталкиваться с одной и той же ошибкой снова и снова.

Parse.Cloud.define("assignVendor", function(request, response){ 
    var orderObjectId = request.params.orderObjectId; 
    var query= new Parse.Query("Order") 
    query.equalTo("objectId", orderObjectId); 
    query.first({ 
     success: function(order){ 
     //order is the newly created parse order object 
     //console.log("Order object found"+ order.get("orderNumber")); 
     var userGeoPoint=new Parse.GeoPoint(); 
     //This is the problematic line 
     userGeoPoint = order.get("customerLocation"); 
     var Query = new Parse.Query(Parse.User); 
     Query.exists("vendorLocation"); 
     Query.near("vendorLocation", userGeoPoint); 
     console.log("Reached here"); 
     Query.find({ 
      success: function(results){ 
       var chemist= results[0]; 
        response.success("found "+vendor.get("profileName")); 
        order.put("vendorLocation", chemist); 
         order.save(null, { 
          success: function(result) {response.success("Saved")}, 
          error: function(error) {console.log("Failed at save")} }); 
      }, 
      error:function(error){console.log("Cant find a suitable vendor")} 
     }); 

    }, error:function(error){console.log("cant find the ");} 

    }); 
}); 

Ошибка показана в консоли облачного кода.

E2015-10-06T11:23:40.858Z]v13 Ran cloud function assignVendor for user 4otr3l7YwG with: 
    Input: {"orderObjectId":"OS5siGRXYW"} 
    Result: TypeError: Cannot call method 'get' of undefined 
    at e.Query.find.success (main.js:25:53) 
    at e.<anonymous> (Parse.js:14:27927) 
    at e.s (Parse.js:14:26859) 
    at e.n.value (Parse.js:14:26278) 
    at e.s (Parse.js:14:26987) 
    at e.n.value (Parse.js:14:26278) 
    at e.s (Parse.js:14:26987) 
    at e.n.value (Parse.js:14:26278) 
    at e.<anonymous> (Parse.js:14:26931) 
    at e.s (Parse.js:14:26859) 

I2015-10-06T11:23:40.924Z]Reached here 

андроид код

 HashMap atMap=new HashMap<>(); 
     atMap.put("orderObjectId", "OS5siGRXYW"); 
     ParseCloud.callFunctionInBackground("assignVendor", atMap, new FunctionCallback<String>() { 
      @Override 
      public void done(String value, ParseException e) { 
       if (e!=null){Log.d("failed ", +e.getCode()+e.getMessage());} else {Log.d("s", value);} 
      } 
     }); 

Ошибка показал в андроида код точно так же, как консоли, так что я havnt отправил его снова. Номер ошибки - «141»

ответ

0

Ниже приведена справочная информация по устранению причины вашей проблемы.

  1. удостоверьтесь, что номер заказа отправлен правильно и что заказ с идентификатором объекта, который вы передаете, существует.
  2. вы можете столкнуться с проблемами при прямом назначении вложенных обратных вызовов функции first(). Лучше использовать then() для объединения обещаний вместе.
  3. лучше использовать get() чем использовать first() при попытке найти один объект, так как вы не должны получить object not found ошибки если get() возвращает ничего, предотвращая ошибку cannot call method get .

Давайте очистить код и посмотреть, если это помогает:

Parse.Cloud.define("assignVendor", function(request, response){ 
    var fetchedOrder; 
    var orderObjectId = request.params.orderObjectId; 
    console.log("orderObjectId = " + orderObjectId); 
    var orderQuery= new Parse.Query("Order") 
    orderQuery.get(orderObjectId) 
     .then(function(order){ 
      fetchedOrder = order; 
      console.log("Order object found"+ fetchedOrder.get("orderNumber")); 
      userGeoPoint = fetchedOrder.get("customerLocation"); 
      var userQuery = new Parse.Query(Parse.User); 
      userQuery.near("vendorLocation", userGeoPoint); 
      return userQuery.first(); 
     }) 
     .then(function(chemist){ 
      order.put("vendorLocation", chemist); 
      return order.save(); 
     }) 
     .then(function(){ 
       response.success("Success!"); 
     }, function (error){ 
      console.error(JSON.stringify(error)); 
      response.error(error); 
     }); 
}); 

Примечания:

  • Вам не нужно определить новый Parse.Geopoint перед тем, как customerLocation. Вы просто переназначаете переменную там.
  • Вам не нужно проверять, существует ли vendorLocation до , сравнивая его с userGeoPoint. Если оно не существует, то он просто обыкновение получить возвращается при использовании near
  • Я бы посоветовал использовать response.success только в конце все ваши обещание нить
  • После userQuery.find(), я считаю, что порядок не существует в этом контексте , поэтому я установил его как функциональную переменную.
  • Там нет необходимости использовать results[0], просто используйте first()