Как сделать запрос API с другим результатом API в NodeJS? - PullRequest
0 голосов
/ 24 июня 2019

Я хочу создать еще один 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

Я хочу отобразить весь API из this.tempdata.

1 Ответ

0 голосов
/ 25 июня 2019

Предисловие: Учитывая, что async и Promise<T> делает правильное использование типов в JavaScript более важным, это хорошая демонстрация того, почему все больше программистов должны использовать TypeScript.

Краткий ответ: вы возвращаете Promise<T> (я полагаю, T - это object) из temperature() и затем передаете его в функцию Response.send ExpressJS, но 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.

...