GraphQL响应错误(String无法表示JSON值)及TypeScript获取单个机场名称失败问题求助
解决机场名称获取问题与GraphQL响应错误
一、修复TypeScript中机场名称获取的问题
你的函数现在返回匹配的机场对象数组而非单个名称,问题出在两个关键细节上:
- 方法选择错误:
filter会返回所有符合条件的元素组成的数组——哪怕只有一个匹配项,结果也是数组结构。应该用find方法,它会直接返回第一个符合条件的单个对象。 - 过滤逻辑不严谨:你在
filter回调里返回i.name.length,虽然能间接判断名称存在,但正确逻辑应该直接返回i.iata_code === name的布尔值,确保精准匹配目标机场。
修改后的代码(同时补充TypeScript类型定义,符合TS环境的严格要求):
// 先给机场数据定义类型,避免any,增强类型检查 interface Airport { name: string; city: string; country: string; iata_code: string; _geoloc: { lat: number; lng: number }; links_count: number; objectID: string; } const getNameOfAirport = (iataCode: string): string | undefined => { // 用find找到第一个匹配的机场对象 const matchedAirport = (AIRPORTS as Airport[]).find(airport => airport.iata_code === iataCode); // 可选链操作符处理找不到的情况,返回名称或undefined return matchedAirport?.name; };
现在执行console.log(getNameOfAirport("BLR")),就能得到你需要的"Bangalore"了。
二、解决GraphQL "String cannot represent value of JSON" 错误
这个错误的核心是GraphQL Schema定义的类型与实际数据类型不匹配:
- 如果是服务器端返回错误:你可能把某个JSON结构的字段(比如机场数据里的
_geoloc)在Schema里定义成了String类型。此时需要把该字段类型改为JSON scalar(多数GraphQL生态库都支持,比如graphql-scalars提供的JSON类型),而非String。 - 如果是客户端请求错误:你可能把JSON对象作为参数传递给了定义为
String类型的GraphQL变量。需要检查客户端变量类型,确保和Schema定义一致,或者调整Schema的参数类型为JSON。
举个Apollo Server的示例,引入JSON scalar的方式:
import { JSONResolver } from 'graphql-scalars'; const typeDefs = ` scalar JSON type Airport { name: String! _geoloc: JSON! # 其他字段... } `; const resolvers = { JSON: JSONResolver, // 其他resolvers逻辑... };
这样就能正确处理JSON结构的字段,避免字符串无法表示JSON值的错误。
内容的提问来源于stack exchange,提问作者Dany 46
相关产品推荐
相关产品推荐

