我想使用来自上一个API的数据来制作另一个API,但我不知道如何使用axios进行多次请求。我尝试了一些东西,但是没有显示任何东西。我想在我的路线数据中显示上一个API的数据。
这是制作另一个最简单的API。
async function temperature() {
this.start = '2017-01-01';
try {
this.latlongdata = await axios.get('https://api.apixu.com/v1/current.json?key=' + WEATHER_KEY + '&q=' + 'navodari');
this.lat = latlongdata.data.location.lat;
this.lon = latlongdata.data.location.lon;
console.log(lat);
this.stationdata = await axios.get('https://api.meteostat.net/v1/stations/nearby?lat=' + this.lat + '&lon=' + this.lon + '&limit=1&key=' + STATION_KEY);
this.station = stationdata.data.data[0].id;
this.tempdata = await axios.get('https://api.meteostat.net/v1/history/daily?station=' + this.station + '&start=' + this.start + '&end=' + this.start + '&key=' + STATION_KEY);
return this.tempdata;
} catch (err) {
console.log(err);
}
};
class WeatherController {
index ({ response }) {
response.send(temperature());
}
}
module.exports = WeatherController
我想显示this.tempdata
中的整个API。
答案 0 :(得分:0)
前言:鉴于async
和Promise<T>
使得在JavaScript中正确使用类型变得更加重要,这很好地说明了为什么更多的程序员应该使用TypeScript。
简短的回答:您要从Promise<T>
返回一个T
(我假设object
是temperature()
),然后将其传递到ExpressJS的Response.send
函数中,但send
不接受Promise
个对象。
Response.send
函数接受类型为Buffer | String | Array | object
的单个参数。在此处进行了记录:https://expressjs.com/en/api.html#res.send (而技术上 Promise<T>
是object
,它不是具有可枚举属性的JSON样式的对象,是send
的期望)。
解决方法很简单:先将Controller操作更改为await
结果的temperature()
(即解决tempdata
对象,然后将其传递到response.send
。>
async index( { response } ) {
let temperatureData = await temperature();
response.send( temperatureData );
}
无关的评论:
*您不应该在this.
函数内部使用temperature()
存储局部值,因为它会在程序中引入与并发相关的错误。始终避免更改共享状态。
*您应该将temperature()
函数重命名为getTemperature()
,甚至还要重命名为getTemperatureAsPromise()
,以使其变得非常清晰,以便用户知道如何使用它,因为您无需使用JSDoc或TypeScript。