GraphQL/GraphCool中Float类型处理经纬度报错,String类型正常问题咨询
Fixing Float Type Error When Extracting Lat/Long in graph.cool Resolvers
我之前在graph.cool封装RestAPI时也碰到过一模一样的问题——用Float类型处理经纬度就报错,换成String就正常。这几乎都是因为RestAPI返回的经纬度数据格式和GraphQL的Float类型预期不匹配导致的,下面我结合常见场景给你分析和解决办法:
先梳理下常见的问题场景(结合你提到的代码结构)
假设你的Resolver SDL大概是这样:
type Query { getLocation: Location! } type Location { # 用Float时报错的写法 latitude: Float! longitude: Float! # 换成String就正常 # latitude: String! # longitude: String! }
对应的Resolver Function(以JavaScript为例)可能是:
module.exports = async (event) => { const response = await fetch('https://your-rest-api.com/location'); const data = await response.json(); // 直接返回时,若data.latitude是字符串类型就会触发Float类型错误 return { latitude: data.latitude, longitude: data.longitude }; };
查询语句:
query { getLocation { latitude longitude } }
核心原因分析
GraphQL的Float类型要求输入/返回的值必须是原生的数字类型,但很多RestAPI会把经纬度以字符串形式返回(比如"37.7749"而不是37.7749),或者返回的数据里夹杂了多余字符(比如"37.7749°N"),这时候直接赋值给Float类型的字段就会触发类型校验错误,而String类型可以兼容任何文本内容,所以不会报错。
解决办法
1. 在Resolver里手动做类型转换与校验
如果RestAPI返回的是字符串形式的纯数字,你可以在Resolver里把字符串转成数字,同时加上异常处理避免崩溃:
module.exports = async (event) => { const response = await fetch('https://your-rest-api.com/location'); const data = await response.json(); // 转换并校验经纬度 const parseCoordinate = (str) => { const num = parseFloat(str); if (isNaN(num)) { // 处理转换失败的情况,比如返回默认值或抛出错误 throw new Error(`Invalid coordinate: ${str}`); } return num; }; return { latitude: parseCoordinate(data.latitude), longitude: parseCoordinate(data.longitude) }; };
2. 清洗RestAPI返回的非法数据
有些情况下,RestAPI可能返回null、空字符串或者带单位的内容(比如"37.7749 N"),这时候你需要先清洗数据:
// 示例:去除非数字字符再转换 const parseCoordinate = (str) => { if (!str) return 0; // 或根据业务需求处理空值 const cleanedStr = str.replace(/[^0-9.-]/g, ''); const num = parseFloat(cleanedStr); return isNaN(num) ? 0 : num; };
3. 若RestAPI返回格式复杂,保留String类型处理
如果RestAPI返回的经纬度包含额外信息(比如精度标记、坐标系统),强行转成Float会丢失数据,这时候可以在SDL里保留String类型,在前端或业务逻辑层再做解析处理。
快速验证方法
你可以先在Resolver里打印经纬度的类型,快速定位问题:
console.log(typeof data.latitude); // 如果输出是"string",就说明需要转换
这样就能快速解决类型不匹配的问题啦!
内容的提问来源于stack exchange,提问作者ricardoNava
相关产品推荐
相关产品推荐

