解析 CloudCode 无效的地理点对象

Posted

技术标签:

【中文标题】解析 CloudCode 无效的地理点对象【英文标题】:Parse CloudCode invalid geopoint object 【发布时间】:2014-07-01 22:14:26 【问题描述】:

我在 Parse Cloud Code 中使用 javascript SDK,试图编写一个过滤掉 GeoPoint 的查询。我不断收到错误:

"code":141,"error":" Error: 102 $nearSphere: invalid geopoint object"

我的代码如下所示:

Parse.Cloud.define("findPeopleNearby", function (request, response) 
Parse.Cloud.useMasterKey();
if (request.params.latitude && request.params.longitude) 
    var point = new Parse.GeoPoint( latitude: request.params.latitude, longitude: request.params.longitude );
    console.log('would query off of GeoPoint: ' + JSON.stringify(point));

    var places = Parse.Object.extend("UserLocation");
    var placesQuery = new Parse.Query(places);
    placesQuery.near("location", point);

    placesQuery.find(
        success: function (results)
        
            console.log("Successfully retrieved " + results.length + " rows.");
            response.success();
        ,
        error: function (error)
        
            response.error("Error: " + error.code + " " + error.message);
        
    );
);

我知道表中的数据是没问题的,因为我可以成功发出curl命令:

curl -X GET -H "X-Parse-Application-Id: xxxx" -H "X-Parse-REST-API-Key: yyyy" -G --data-urlencode 'limit=5' --data-urlencode 'where= "location":  "$nearSphere":  "__type": "GeoPoint", "latitude": 37.33521504  , "longitude": -122.03254905 , "$maxDistanceInMiles":10.0  '  https://api.parse.com/1/classes/UserLocation

我最初在 Installation 表上有 location 属性(这是我希望的位置),但我看到 this Q&A 并认为我会在它自己的对象中尝试它,但这似乎并没有不同。

顺便说一句,如果我可以让这个查询工作,我的下一个尝试是使用父指针加入安装对象。如果我能理解导致此错误的原因,我希望/假设这会起作用。

谢谢

编辑控制台输出

would query off of GeoPoint: "__type":"GeoPoint","latitude":"37.33521504","longitude":"-122.03254905"

【问题讨论】:

控制台日志如何找点? 我的猜测是纬度/经度不是数字,因此 Parse.GeoPoint 无效,真的需要查看point 的第一个console.log 的输出。 arrrgh,我敢打赌就是这样。我今晚试试。更新的问题。谢谢一千。 @Fosco 我可以建议Parse.GeoPoint 构造函数在下一个版本不是数字时尝试在输入上执行parseFloat() 【参考方案1】:

蒂莫西的怀疑是正确的。输入是字符串而不是浮点数。转换输入解决了错误,事实上,查询“加入”安装对象也可以正常工作。一个愚蠢的错误,但希望现在任何人在谷歌上搜索它都会找到一个结果来为他们指明正确的方向。

长版供参考:

        var lat, lng;

    if (typeof request.params.latitude === "number") 
        lat = request.params.latitude;
    
    else 
        lat = parseFloat(request.params.latitude);
        // this could return NaN
    

    if (typeof request.params.longitude === "number") 
        lng = request.params.longitude;
    
    else 
        lng = parseFloat(request.params.longitude);
    

    var point = new Parse.GeoPoint( latitude: lat, longitude: lng );

【讨论】:

以上是关于解析 CloudCode 无效的地理点对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在保存之前查询 CloudCode 中的对象?

解析服务器 + 云代码:Parse.Object 上的 beforeSave()

解析云代码如何与解析服务器一起工作?

Json反序列化解析无效的Json对象

解析 Cloud Code 关系查询语法

使用 Spring boot 解析具有无效键值的 JSON 对象