{"record":{"id":"8d10700db03fde1e","repo":"MagicMirrorOrg/MagicMirror","slug":"latitude-and-longitude-are-required","errorCode":null,"errorMessage":"Latitude and longitude are required","messagePattern":"Latitude and longitude are required","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"defaultmodules/weather/provider-utils.js","lineNumber":163,"sourceCode":"\t\tWSW: 247.5,\n\t\tW: 270,\n\t\tWNW: 292.5,\n\t\tNW: 315,\n\t\tNNW: 337.5\n\t};\n\treturn directions[direction] ?? null;\n}\n\n/**\n * Validate and limit coordinate precision\n * @param {object} config - Configuration object with lat/lon properties\n * @param {number} maxDecimals - Maximum decimal places to preserve\n * @throws {Error} If coordinates are missing or invalid\n */\nfunction validateCoordinates (config, maxDecimals = 4) {\n\tif (config.lat == null || config.lon == null\n\t  || !Number.isFinite(config.lat) || !Number.isFinite(config.lon)) {\n\t\tthrow new Error(\"Latitude and longitude are required\");\n\t}\n\n\tconfig.lat = limitDecimals(config.lat, maxDecimals);\n\tconfig.lon = limitDecimals(config.lon, maxDecimals);\n}\n\nmodule.exports = {\n\tconvertWeatherType,\n\tapplyTimezoneOffset,\n\tlimitDecimals,\n\tgetSunTimes,\n\tisDayTime,\n\tformatTimezoneOffset,\n\tgetDateString,\n\tconvertKmhToMs,\n\tcardinalToDegrees,\n\tvalidateCoordinates\n};","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/MagicMirrorOrg/MagicMirror/blob/4b4a59534f7da01e4030e46029fe9dd649a7675e/defaultmodules/weather/provider-utils.js#L145-L181","documentation":"validateCoordinates checks that config.lat and config.lon exist and are finite numbers before rounding them to a fixed number of decimal places. This error is thrown when either coordinate is null/undefined or not a finite number. Every weather provider calls it during initialize(), so a provider cannot start without valid coordinates.","triggerScenarios":"initialize() is called with config.lat or config.lon missing (undefined/null) or set to a non-numeric value such as a string '52.1', NaN, or Infinity.","commonSituations":"Config not passing lat/lon at all (weather module requires them); coordinates read from env vars or JSON as strings without parsing; typo in key names (latitude/longitude instead of lat/lon); template placeholder left unfilled.","solutions":["Set config.lat and config.lon as numbers, e.g. lat: 52.3738, lon: 4.8910","If coordinates come as strings, convert with Number(value) before initialize()","Check for typos in config keys (must be lat/lon exactly)","Ensure the values are finite numbers, not null, undefined, NaN or Infinity"],"exampleFix":"// before\nconst config = { type: \"current\", lat: process.env.LAT, lon: process.env.LON };\nprovider.initialize(config);\n// after\nconst config = { type: \"current\", lat: Number(process.env.LAT), lon: Number(process.env.LON) };\nif (Number.isFinite(config.lat) && Number.isFinite(config.lon)) provider.initialize(config);","handlingStrategy":"validation","validationCode":"function hasValidCoordinates(config) {\n  return config != null\n    && Number.isFinite(config.lat)\n    && Number.isFinite(config.lon);\n}\nif (!hasValidCoordinates(config)) throw new Error(\"lat/lon must be finite numbers before initialize()\");","typeGuard":"const isFiniteNumber = (v) => typeof v === \"number\" && Number.isFinite(v);","tryCatchPattern":"try {\n  provider.initialize(config);\n} catch (err) {\n  if (err.message === \"Latitude and longitude are required\") {\n    console.error(\"Config missing numeric lat/lon:\", config);\n  } else throw err;\n}","preventionTips":["Parse env/config string coordinates with Number() before use","Validate lat/lon with Number.isFinite in a preflight check","Keep key names exactly lat/lon per the module docs","Add a unit test asserting config validation for each provider"],"tags":["config","coordinates","validation"],"backgroundTag":"missing-required-config","analyzedSha":"4b4a59534f7da01e4030e46029fe9dd649a7675e","analyzedAt":"2026-08-31T21:49:42.591Z","schemaVersion":2},"datasetVersion":"2026-08-31T22:30:34.772Z"}