如何在NodeJS中使用另一个API发出API请求?

时间:2019-06-24 20:58:36

标签: node.js api async-await request axios

我想使用来自上一个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。

1 个答案:

答案 0 :(得分:0)

前言:鉴于asyncPromise<T>使得在JavaScript中正确使用类型变得更加重要,这很好地说明了为什么更多的程序员应该使用TypeScript。

简短的回答:您要从Promise<T>返回一个T(我假设objecttemperature()),然后将其传递到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。