Získanie údajov o počasí pomocou Node.js

Zápisník experimentátora

Hierarchy: Node.js

V tomto článku si ukážeme, ako sa dajú stiahnuť online údaje o počasi. Využijeme na to server openweathermap.org. Programovať budeme v javascripte. Toto je prvý článok v sérii, ktorá zahŕňa Node.js, ESP8266 a Arduino MKR1000. V tomto článku si vysvetlíme všetky základné informácie a v ďalších článkoch sa budeme sústreďovať iba na programovanie.

openweathermap.org

Tento server poskytuje údaje o počasi. Môžete sa na serveri zaregistrovať a potom získate kľúč k API, pomocou ktorého si môžete zo servera stiahnuť údaje o počasi a využiť ich pre vlastné účely. Registrácia je bezplatná, pokiaľ sa uspokojíte so základnými funkciami API. Presný zoznam poskytovaných služieb nájdete na stránke openweathermap.org/price.

Pre našu ukážku budeme využívať funkciu API Current weather data. Jej kompletný popis nájdete na stránke openweathermap.org/current. Budeme používať dve funkcie.

  • By city name - Funkciu zavoláte s parametrom vášho mesta a získate údaje o počasi.
  • By city ID - Funkciu zavoláte s identifikátorom vášho mesta a získate údaje o počasi. Identifikátor získate na stránke tak, že si dáte vyhľadať vaše mesto a pozriete si parameter v URL. Napríklad.

Server vráti údaje o počasi vo formáte JSON. Pomocou parametrov môžete nastaviť niektoré údaje. Môžete meniť napríklad zobrazenie teploty v stupňoch Kelvina, Celzia alebo vo Fahrenheitoch. Vrátené údaje vyzerajú takto.

{ coord: { lon: 19.15, lat: 48.74 },
  weather:
   [ { id: 801,
       main: 'Clouds',
       description: 'few clouds',
       icon: '02n' } ],
  base: 'stations',
  main:
   { temp: 19.43,
     pressure: 1011,
     humidity: 64,
     temp_min: 19,
     temp_max: 20 },
  visibility: 10000,
  wind: { speed: 0.5 },
  clouds: { all: 20 },
  dt: 1525030200,
  sys:
   { type: 1,
     id: 5909,
     message: 0.004,
     country: 'SK',
     sunrise: 1524972341,
     sunset: 1525024594 },
  id: 3061186,
  name: 'Banska Bystrica',
  cod: 200 }

Program pre Node.js

Program sa skladá z dvoch súborov. V prvom súbore sa nachádza hlavný program. V druhom súbore sa nachádza trieda OpenWeatherMap, ktorá zabezpečuje komunikáciu so serverom. Pred použitím je potrebné nastaviť dve veci.

  • Nainštalovať balíčky pomocou príkazu npm install.
  • Nastaviť si vlasný kľúč k API. To môžete urobiť priamo úpravou zdrojového kódu v súbore index.js alebo nastavením v systéme, ktoré sa prenesie do programu ako premenná process.env.APPID. Napríklad pre Windows to nastavíte príkazom set APPID=xxx.

index.js

V tomto súbore sa nastavia parametre požiadavky v premennej cfg a zavolá sa vhodná funkcia. Jedna funkcia vráti údaje o počasi podľa názvu mesta a druhá funkcia vráti údaje o počasi podla ID mesta.

const OpenWeatherMap = require('./openweathermap.js');

var cfg = {
        APPID: process.env.APPID || 'YOUR_APPID',
        units: "metric"
    };

var api = new OpenWeatherMap(cfg);

///
/// Current weather by city ID (Banska Bystrica)
///
/*api.getCurrentWeatherByCityID('3061186', (err, currentWeather) => {
    if(err) {
        console.log(err.message);
    }
    else {
        console.log(currentWeather);
    }
});*/

///
/// Current weather by city name (Banska Bystrica)
///
api.getCurrentWeatherByCityName('Banska Bystrica', (err, currentWeather) => {
    if(err) {
        console.log(err.message);
    }
    else {
        console.log(currentWeather);
    }
});

openweathermap.js

Trieda OpenWeatherMap. Na získanie údajov využíva balíček request, pomocou ktorého sa ľahko zostavujú HTTP požiadavky. Formát požiadavky pre API vidíte priamo v zdrojovom kóde.

const request = require("request");

module.exports = class OpenWeatherMap {

    constructor(config) {
        this.config = config;
    }

    getCurrentWeatherByCityName(cityName, callback) {
        var self = this;
        request.get(`https://api.openweathermap.org/data/2.5/weather?q=${cityName}&units=${this.config.units}&APPID=${this.config.APPID}`,
            (err, data) => {
            self.parseResponse(err, data, callback);
        })
    };

    getCurrentWeatherByCityID(cityId, callback) {
        var self = this;
        request.get(`https://api.openweathermap.org/data/2.5/weather?id=${cityId}&units=${this.config.units}&APPID=${this.config.APPID}`,
            (err, data) => {
            self.parseResponse(err, data, callback);
        })
    };

    parseResponse(err, data, callback){
        var error = null;
        var response = null;
    
        error = err;
        if(data) {
            if(data.statusCode != 200) {
                var e = JSON.parse(data.body)
                error = new Error(e.message);
                error.status = e.cod;
            }
            if(data.body) {
                response = JSON.parse(data.body);
            }
        }
    
        callback(error, response);
    }

} 

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.


29.04.2018


Menu