firebase 在Typescript中格式化JSON响应API调用

ao218c7q  于 2023-01-14  发布在  TypeScript
关注(0)|答案(1)|浏览(107)

我是Typescript的新手,想用Firebase函数构建一个简单的天气应用程序,首先我想调用一个API来获取一个城市的当前温度。
这是API调用的JSON响应:

{
"latitude": 40.710335,
"longitude": -73.99307,
"generationtime_ms": 0.3579854965209961,
"utc_offset_seconds": 0,
"timezone": "GMT",
"timezone_abbreviation": "GMT",
"elevation": 27.0,
"current_weather": {
    "temperature": 12.3,
    "windspeed": 14.0,
    "winddirection": 181.0,
    "weathercode": 3,
    "time": "2023-01-13T09:00"
},
"hourly_units": {
    "time": "iso8601",
    "temperature_2m": "°C"
},

在调用这个API时,我只想从当前天气中检索温度,下面是我当前的代码:

export const getWeather = functions.https.onRequest(async (request, response) => {
  const dataResponse = await fetch("https://api.open-meteo.com/v1/forecast?latitude=40.71&longitude=-74.01&hourly=temperature_2m&current_weather=true");
  const data = await dataResponse.json();

  console.log(data);
  response.send(data);
});

我怎么能从JSON响应中只得到一个值(温度)呢?

htrmnn0y

htrmnn0y1#

欢迎来到堆栈溢出!
看起来你想从API调用返回的JSON对象中访问一个值。在JavaScript中,你可以这样做:

myObj.<nested_item1>

所以在你的情况下,你想要

// should be 12.3 based off your response
const temperature = data.current_weather.temperature

希望这有帮助!

    • 编辑**:类型脚本

在TypeScript中,如果你没有明确指定数据的结构,TS将尝试自动推断数据。在你的例子中,你正在进行一个fetch调用,这意味着TS没有上下文来描述输出是什么。
想象一下,从TS的Angular 来看,你点击的url可能包含一个API调用、一个网站或任何东西。
要解决此问题,您有两个选项:
1.禁用线路的TS(不推荐)

// @ts-ignore
const temperature = data.current_weather.temperature

1.定义提取响应的类型

type WeatherData = {
  latitude: number
  longitude: number
  generationtime_ms: number
  utc_offset_seconds: number
  timezone: string
  timezone_abbreviation: string
  elevation: number
  current_weather: {
    temperature: number
    windspeed: number
    winddirection: number
    weathercode: number
    time: string
  }
  hourly_units: {
    time: string
    temperature_2m: string
  }
}

...
const data = await dataResponse.json() as WeatherData
...

相关问题