// Importujemy wymagane moduły const express = require('express'); // framework do tworzenia serwera HTTP const axios = require('axios'); // biblioteka do wykonywania zapytań HTTP const path = require('path'); // moduł do obsługi ścieżek plików // Tworzymy instancję aplikacji Express const app = express(); const PORT = 3000; // Port, na którym nasłuchuje serwer // Wyświetlamy informację o starcie aplikacji const now = new Date(); console.log(`Aplikacja uruchomiona: ${now.toLocaleString()}, autor: Julia, port: ${PORT}`); // Ustawiamy folder 'public' jako katalog ze statycznymi plikami (CSS, obrazy itd.) app.use(express.static(path.join(__dirname, 'public'))); // Middleware do parsowania danych przesyłanych przez formularz (x-www-form-urlencoded) app.use(express.urlencoded({ extended: true })); // Obsługa żądania GET na ścieżkę główną – wyświetlenie strony startowej (formularza) app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'views', 'index.html')); }); // Obsługa żądania POST na ścieżkę /pogoda – po wysłaniu formularza app.post('/pogoda', async (req, res) => { const country = req.body.country; // Pobieramy kraj z formularza const city = req.body.city; // Pobieramy miasto z formularza // Przykładowe dane – współrzędne geograficzne dla wybranych miast const cities = { "Polska": { "Warszawa": { lat: 52.23, lon: 21.01 }, "Lublin": { lat: 51.25, lon: 22.57 }, "Gdańsk": { lat: 54.35, lon: 18.65 } }, "Niemcy": { "Berlin": { lat: 52.52, lon: 13.41 }, "Monachium": { lat: 48.14, lon: 11.58 }, "Hamburg": { lat: 53.55, lon: 9.99 } }, "Francja": { "Paryż": { lat: 48.85, lon: 2.35 }, "Marsylia": { lat: 43.30, lon: 5.37 }, "Lyon": { lat: 45.75, lon: 4.85 } } }; // Sprawdzenie, czy dane miasto i kraj są dostępne w naszej bazie if (!cities[country] || !cities[country][city]) { return res.send("Błąd: Nie znaleziono danych dla wybranego miasta i kraju."); } // Pobieramy współrzędne geograficzne miasta const { lat, lon } = cities[country][city]; try { // Wysyłamy zapytanie do API open-meteo z aktualnymi danymi pogodowymi const response = await axios.get(`https://api.open-meteo.com/v1/forecast`, { params: { latitude: lat, longitude: lon, current_weather: true // Pobieramy tylko aktualną pogodę } }); // Odczytujemy dane pogodowe z odpowiedzi const weather = response.data.current_weather; // Pobieramy bieżącą datę i czas serwera (w strefie czasu Warszawy) const serverDate = new Date(); const localServerDate = new Date(serverDate.toLocaleString("en-US", { timeZone: "Europe/Warsaw" })); // Formatowanie daty i czasu const serverDateFormatted = localServerDate.toLocaleDateString('pl-PL'); const serverTimeFormatted = localServerDate.toLocaleTimeString('pl-PL', { hour: '2-digit', minute: '2-digit', hour12: false }); // Wyświetlamy wyniki w przeglądarce res.send(`

Pogoda w ${city}, ${country}

Temperatura: ${weather.temperature}°C

Wiatr: ${weather.windspeed} km/h

Data i Godzina: ${serverDateFormatted} ${serverTimeFormatted}

`); } catch (err) { // Obsługa błędów np. problemów z API console.error(err); res.send("Wystąpił błąd podczas pobierania pogody."); } }); // Uruchamiamy serwer i nasłuchujemy na wskazanym porcie app.listen(PORT, '0.0.0.0', () => { console.log(`Aplikacja działa na porcie ${PORT}`); });