Files
LAB_2/MojaAplikacja/app.js
2025-05-13 18:26:48 +02:00

101 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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(`
<h2>Pogoda w ${city}, ${country}</h2>
<p>Temperatura: ${weather.temperature}°C</p>
<p>Wiatr: ${weather.windspeed} km/h</p>
<p>Data i Godzina: ${serverDateFormatted} ${serverTimeFormatted}</p>
`);
} 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}`);
});