Запрос информации из API через Node.js - PullRequest
0 голосов
/ 09 июля 2020
• 1000

Он застревает в этой строке кода:

const cityName = weatherData.data.city_name;

Есть подсказка, почему он так делает? Пожалуйста

// Creating the server of the weather app
const express = require('express');
const app = express();


const { StringDecoder } = require('string_decoder');
const decoder = new StringDecoder('utf8');

const https = require('https');


app.get('/', (req, res) => {
    const weatherPath = "https://api.weatherbit.io/v2.0/current?key=41c0f84d717a4764a26d144aa33a9443&city=melbourne,Australia"

    // Calling the weather app 
    https.get(weatherPath, (response) => {
        console.log(response.statusCode);
        
        // Getting the data from the weather app
        response.on('data', (d) => {
            //console.log(d);
            
            
            // Converting the buffer data from the weather app
            console.log(decoder.write(d));

            const weatherData = decoder.write(d);

            const cityName = weatherData.data.city_name;

            console.log(cityName);


          });
    });

    res.send("The server is up and running on the web");

});



app.listen(3000, () => 
{

    console.log('Server is running on port 3000');
});

Ответы [ 3 ]

0 голосов
/ 09 июля 2020

Ваши данные представляют собой строку и, следовательно, не имеют этих свойств. Сначала вам нужно JSON.parse.

Но есть еще одна проблема: ваш код сломается, как только будет возвращено больше данных, потому что вы слушаете только один фрагмент данных. Вам нужно сложить все фрагменты (добавить к существующим фрагментам для каждого события data) и обработать полные данные для события end.

Но в целом метод https.get очень прост - кости, будет намного проще использовать такой пакет, как node-fetch:

// Creating the server of the weather app
const express = require('express');
const app = express();

const fetch = require('node-fetch')

app.get('/', (req, res) => {
    const weatherPath = "https://api.weatherbit.io/v2.0/current?key=41c0f84d717a4764a26d144aa33a9443&city=melbourne,Australia"

    // Calling the weather app 
    fetch(weatherPath)
      .then(response => response.json())
      .then(weatherData => {
        // Getting the data from the weather app 
        const cityName = weatherData.data[0].city_name;
        console.log(cityName); 
      }).catch(e => {
        console.error('An error occured!', e);
      });

    res.send("The server is up and running on the web");
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

Дополнительная информация

Для ответа на ваш комментарий:

Я преобразовал данные в строку, хотя в командной строке это выглядело как JSON.

Термин «JSON» часто сбивает с толку. Технически JSON (JavaScript Object Notation) - это формат сериализации, строковое представление объекта или другого базового c JavaScript типа данных (с ограничениями). Концепция «живого» объекта существует только в памяти внутри вашего скрипта. Итак, API всегда отправляет вам строку символов. Эта строка "равна" JSON, т.е. использует JSON как метод представления структурированных данных, которые при синтаксическом анализе (!) Могут быть превращены обратно в объект JavaScript (в памяти). Итак, вы правы в том, что это выглядело как JSON, поскольку оно есть, но на тот момент это все еще строка.

Это все равно, что отправить вам чертеж (2D-представление - JSON строка) дома (3D объект - исходный объект). (Очевидно, что вы не можете отправить дом в письме, поэтому люди вместо этого отправляют чертежи (JSON).) Он выглядит как дом, потому что он представляет его, но вы еще не можете открыть его дверь (получить доступ к собственности ) или что-то. В этот момент это все еще что-то напечатанное на листе бумаги (нить), которое люди распознают как план (это действительно JSON). Сначала вам нужно построить настоящий дом (преобразовать JSON обратно в объект) из чертежа.

(Конечно, это не улучшится, если использовать имя переменной, например json, для представления данные извлекаются из JSON, как это иногда бывает.)

0 голосов
/ 09 июля 2020

Я решил использовать модуль расширенного узла, который обычно называется ax ios

Посмотрите код,

// Creating the server of the weather app
const express = require('express');
const app = express();
const axios = require('axios');

app.get('/', (req, res) =>
{
    //In production we do not need this
    process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0;
    const weatherPath = "https://api.weatherbit.io/v2.0/current?key=41c0f84d717a4764a26d144aa33a9443&city=melbourne,Australia";
    axios.get(weatherPath)
        .then(function (response)
        {
            // handle success
            let cityName = response.data.data[0].city_name;
            console.log(cityName);
        })
        .catch(function (error)
        {
            // handle error
            console.log(error);
        })
        .finally(function ()
        {
            // always executed
        });
    res.send("The server is up and running on the web");
});


app.listen(3000, () =>
{

    console.log('Server is running on port 3000');
});
0 голосов
/ 09 июля 2020

Я попытался использовать API и получить ответ:

{"data":[{"rh":73,"pod":"n","lon":144.96332,"pres":1025.6,"timezone":"Australia\/Melbourne","ob_time":"2020-07-09 09:05","country_code":"AU","clouds":50,"ts":1594285500,"solar_rad":0,"state_code":"07","city_name":"Melbourne","wind_spd":1,"wind_cdir_full":"north-northwest","wind_cdir":"NNW","slp":1026.3,"vis":5,"h_angle":-90,"sunset":"07:16","dni":0,"dewpt":8.2,"snow":0,"uv":0,"precip":0,"wind_dir":348,"sunrise":"21:34","ghi":0,"dhi":0,"aqi":61,"lat":-37.814,"weather":{"icon":"c02n","code":"802","description":"Scattered clouds"},"datetime":"2020-07-09:09","temp":12.8,"station":"E5657","elev_angle":-20.02,"app_temp":12.8}],"count":1}

Изменить:
Я не пробовал использовать ваш код в приложении раньше, я пробую через браузер is mycode

// Calling the weather app 
    https.get(weatherPath, (response) => {  
        response.setEncoding('utf8')
        let chunks = []
        // Getting the data from the weather app
        response.on('data', (d) => {
            chunks.push(d);
        });
        response.on('end', () => {
           let data = JSON.parse(chunks.join(''))
           console.log(data.data[0].city_name)
        });

          
    });

weather.data - это массив, поэтому при попытке доступа weather.data.city_name будет неопределенным. Вы должны войти в weather.data[0].city_name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...