2015-10-06 48 views
0

我有一个用户类,包含两种类型的用户 - 客户和供应商。用户表中有一个名为vendorLocation的列(GeoPoint),它具有供应商商店的坐标,但对于客户保留为空(空)。在解析的云代码中使用地理位置

当客户下订单时,会在Order Class中创建一个新对象,我将地址位置存储为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 

了Android代码的Android代码

 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. 确保订单号码正确传递 并且存在您传递的对象ID的顺序。
  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); 
     }); 
}); 

注:

  • 你不需要得到 customerLocation之前定义一个新的Parse.Geopoint。你只是在那里重新分配一个变量。
  • 您不需要检查vendorLocation是否在 之前存在,并将其与userGeoPoint进行比较。如果它不存在,它只是 不会得到使用near
  • 时,我只会在最后所有 承诺线程使用response.success劝返回
  • 后userQuery.find(),我认为,为了不存在在那个 上下文中,所以我将它设置为一个函数变量。
  • 无需使用results[0],只需使用first()