Error handling

This commit is contained in:
2023-09-04 20:15:05 -04:00
parent 9db32e4d5a
commit cf3ee4feef
10 changed files with 182 additions and 105 deletions

View File

@@ -3,25 +3,23 @@ import { setAirport } from "@/js/state";
import { Airport } from "@/js/airport";
import Metar from '@/components/Metar';
setAirport('KJYO', new Airport('Leesburg Executive Airport', 'KJYO'))
setAirport('KHEF', new Airport('Manassas Regional Airpoirt', 'KHEF'))
setAirport('KIAD', new Airport('Dulles International Airport', 'KIAD'))
setAirport('KFDK', new Airport('Frederick Municipal Airport', 'KFDK'))
setAirport('KMRB', new Airport('Eastern West Virginia Regional Airport', 'KMRB'))
setAirport('KOKV', new Airport('Winchester Regional Airport', 'KOKV'))
setAirport('KFRR', new Airport('Front Royal-Warren County Airport', 'KFRR'))
setAirport('KLUA', new Airport('Luray Caverns Airport', 'KLUA'))
setAirport('KSHD', new Airport('Shenandoah Valley Airport', 'KSHD'))
setAirport('KCHO', new Airport('Charlottesville-Albemarle Airport', 'KCHO'))
setAirport('KCJR', new Airport('Culpeper Regional Airport', 'KCJR'))
setAirport('KHWY', new Airport('Warrenton-Fauquier Airport', 'KHWY'))
setAirport('KRMN', new Airport('Stafford Regional Airport', 'KRMN'))
setAirport('KEZF', new Airport('Shannon Airport', 'KEZF'))
setAirport('KDCA', new Airport('Ronald Reagan Washington National Airport', 'KDCA'))
// setAirport('KJYO', new Airport('Leesburg Executive Airport', 'KJYO'))
setAirport('KHEF', new Airport('Manassas Regional Airpoirt', 'KHEF', 38.724, -77517))
// setAirport('KIAD', new Airport('Dulles International Airport', 'KIAD'))
// setAirport('KFDK', new Airport('Frederick Municipal Airport', 'KFDK'))
// setAirport('KMRB', new Airport('Eastern West Virginia Regional Airport', 'KMRB'))
// setAirport('KOKV', new Airport('Winchester Regional Airport', 'KOKV'))
// setAirport('KFRR', new Airport('Front Royal-Warren County Airport', 'KFRR'))
// setAirport('KLUA', new Airport('Luray Caverns Airport', 'KLUA'))
// setAirport('KSHD', new Airport('Shenandoah Valley Airport', 'KSHD'))
// setAirport('KCHO', new Airport('Charlottesville-Albemarle Airport', 'KCHO'))
// setAirport('KCJR', new Airport('Culpeper Regional Airport', 'KCJR'))
// setAirport('KHWY', new Airport('Warrenton-Fauquier Airport', 'KHWY'))
// setAirport('KRMN', new Airport('Stafford Regional Airport', 'KRMN'))
// setAirport('KEZF', new Airport('Shannon Airport', 'KEZF'))
// setAirport('KDCA', new Airport('Ronald Reagan Washington National Airport', 'KDCA'))
export default function Page() {
return <>
<div>
<Metar/>

View File

@@ -17,7 +17,7 @@ export default async function Metar() {
async function update() {
const airports: Airport[] = getAirports();
const metars = await getMetars(airports);
for (let i = 0; i < airports.length; i++) {
for (let i = 0; i < metars.length; i++) {
airports[i].metar = metars[i];
airports[i].latitude = metars[i].latitude;
airports[i].longitude = metars[i].longitude;

View File

@@ -7,11 +7,11 @@ export class Airport {
longitude: number;
metar: Metar | undefined;
constructor(name: string, icao: string) {
constructor(name: string, icao: string, latitude: number, longitude: number) {
this.name = name;
this.icao = icao;
this.latitude = 0;
this.longitude = 0;
this.latitude = latitude;
this.longitude = longitude;
this.metar = undefined;
}
}

View File

@@ -2,78 +2,88 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
import axios from 'axios';
import { xml2json } from 'xml-js';
// import { xml2json } from 'xml-js';
import { Airport } from './airport';
const base_url = 'https://beta.aviationweather.gov/cgi-bin/data';
// const base_url = 'https://beta.aviationweather.gov/cgi-bin/data';
export async function getMetars(airports: Airport[]): Promise<Metar[]> {
const stationICAOs: string = airports
.map((airport) => airport.icao)
.join(',');
const url = `${base_url}/metar.php?ids=${stationICAOs}&format=xml`;
const response = await axios
.get(`${url}`)
.catch((error) => console.error(`${error}`));
const metars: Metar[] = [];
if (response != null && response != undefined) {
const json = xml2json(response.data, { compact: true });
const jsonObject = JSON.parse(json);
let metarData = jsonObject?.response?.data?.METAR;
if (!Array.isArray(metarData)) {
metarData = [metarData];
}
for (const data of metarData) {
const sky_condition: {
sky_cover: string;
cloud_base_ft_agl: number;
}[] = [];
if (Array.isArray(data.sky_condition)) {
for (const sc of data.sky_condition) {
sky_condition.push({
sky_cover: sc.sky_cover,
cloud_base_ft_agl: Number(sc.cloud_base_ft_agl)
})
}
} else {
sky_condition.push({
sky_cover: data.sky_condition?.sky_cover,
cloud_base_ft_agl: Number(data.sky_condition?.cloud_base_ft_agl)
})
}
const metar: Metar = {
raw_text: data.raw_text._text,
station_id: data.station_id._text,
observation_time: data.observation_time._text,
latitude: Number(data.latitude._text),
longitude: Number(data.longitude._text),
temp_c: Number(data.temp_c._text),
dewpoint_c: Number(data.dewpoint_c._text),
wind_dir_degrees: data.wind_dir_degrees._text,
wind_speed_kt: Number(data.wind_speed_kt._text),
visibility_statute_mi: data.visibility_statute_mi?._text,
altim_in_hg: Number(data.altim_in_hg?._text),
sea_level_pressure_mb: data.sea_level_pressure_mb?._text,
quality_control_flags: {
auto: data.quality_control_flags?.auto?._text == 'TRUE',
auto_station: data.quality_control_flags?.auto_station?._text == 'TRUE',
},
wx_string: data.wx_string?._text,
sky_condition: sky_condition,
flight_category: data.flight_category._text,
three_hr_pressure_tendency_mb: data.three_hr_pressure_tendency_mb?._text,
metar_type: data.metar_type._text,
maxT_c: Number(data.maxT_c?._text),
minT_c: Number(data.minT_c?._text),
precip_in: Number(data.precip_in?._text),
elevation_m: Number(data.elevation_m._text),
};
metars.push(metar);
}
}
return metars;
.map((airport) => airport.icao)
.join(',');
const url = `http://localhost:5000/metars/KHEF`;
const response = await axios.get(url).catch((error) => console.error(error));
console.log(response);
return [];
}
// export async function getMetars(airports: Airport[]): Promise<Metar[]> {
// const stationICAOs: string = airports
// .map((airport) => airport.icao)
// .join(',');
// const url = `${base_url}/metar.php?ids=${stationICAOs}&format=xml`;
// const response = await axios
// .get(`${url}`)
// .catch((error) => console.error(`${error}`));
// const metars: Metar[] = [];
// if (response != null && response != undefined) {
// const json = xml2json(response.data, { compact: true });
// const jsonObject = JSON.parse(json);
// let metarData = jsonObject?.response?.data?.METAR;
// if (!Array.isArray(metarData)) {
// metarData = [metarData];
// }
// for (const data of metarData) {
// const sky_condition: {
// sky_cover: string;
// cloud_base_ft_agl: number;
// }[] = [];
// if (Array.isArray(data.sky_condition)) {
// for (const sc of data.sky_condition) {
// sky_condition.push({
// sky_cover: sc.sky_cover,
// cloud_base_ft_agl: Number(sc.cloud_base_ft_agl)
// })
// }
// } else {
// sky_condition.push({
// sky_cover: data.sky_condition?.sky_cover,
// cloud_base_ft_agl: Number(data.sky_condition?.cloud_base_ft_agl)
// })
// }
// const metar: Metar = {
// raw_text: data.raw_text._text,
// station_id: data.station_id._text,
// observation_time: data.observation_time._text,
// latitude: Number(data.latitude._text),
// longitude: Number(data.longitude._text),
// temp_c: Number(data.temp_c._text),
// dewpoint_c: Number(data.dewpoint_c._text),
// wind_dir_degrees: data.wind_dir_degrees._text,
// wind_speed_kt: Number(data.wind_speed_kt._text),
// visibility_statute_mi: data.visibility_statute_mi?._text,
// altim_in_hg: Number(data.altim_in_hg?._text),
// sea_level_pressure_mb: data.sea_level_pressure_mb?._text,
// quality_control_flags: {
// auto: data.quality_control_flags?.auto?._text == 'TRUE',
// auto_station: data.quality_control_flags?.auto_station?._text == 'TRUE',
// },
// wx_string: data.wx_string?._text,
// sky_condition: sky_condition,
// flight_category: data.flight_category._text,
// three_hr_pressure_tendency_mb: data.three_hr_pressure_tendency_mb?._text,
// metar_type: data.metar_type._text,
// maxT_c: Number(data.maxT_c?._text),
// minT_c: Number(data.minT_c?._text),
// precip_in: Number(data.precip_in?._text),
// elevation_m: Number(data.elevation_m._text),
// };
// metars.push(metar);
// }
// }
// return metars;
// }
export interface Metar {
raw_text: string;
station_id: string;