You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GraphQL响应错误(String无法表示JSON值)及TypeScript获取单个机场名称失败问题求助

解决机场名称获取问题与GraphQL响应错误

一、修复TypeScript中机场名称获取的问题

你的函数现在返回匹配的机场对象数组而非单个名称,问题出在两个关键细节上:

  1. 方法选择错误:filter会返回所有符合条件的元素组成的数组——哪怕只有一个匹配项,结果也是数组结构。应该用find方法,它会直接返回第一个符合条件的单个对象。
  2. 过滤逻辑不严谨:你在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:27:27