Estoy tratando de crear una aplicación meteorológica y estoy usando una API meteorológica para obtener la información, pero aparece este error cuando intento analizar los datos JSON: SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>) at IncomingMessage.<anonymous> edición: necesito obtener los valores de latitud y longitud de una solicitud https. Intenté devolverlo, pero seguirá diciendo que lon y lat no están definidos.
segunda edición: si ingreso los valores de lon y lat, analizará los datos y devolverá el JSON, pero necesito los valores de lon y lat de la API locaionIQ en la solicitud https. ¿Cómo obtengo esos valores? aquí está el código:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); const https = require('https'); const { static, response } = require('express'); require('dotenv').config(); app.use(bodyParser.urlencoded({extended:true})); app.use(express.static('public')) app.listen(3000, ()=>{ console.log("server is running on port 3000") }) app.get('/', (req,res)=>{ res.sendFile(__dirname+'/index.html') }) app.post('/', (req,res)=>{ let apiKeyLocationIQ = process.env.API_KEY_LOCATIONIQ; let apiKeyWeather = process.env.API_KEY_WEATHER; let cityLocationIQ = req.body.citySearch; let urlLocationIQ = "https://api.locationiq.com/v1/search.php?format=JSON&key="+apiKeyLocationIQ+"&q="+cityLocationIQ+"&limit=1"; https.get(urlLocationIQ, function(response){ response.on("data",function(data){ let locationIQ = JSON.parse(data); const lat= locationIQ[0].lat; const lon= locationIQ[0].lon; const cityName = locationIQ[0].display_name; }) }) let urlWeather = 'https://api.openweathermap.org/data/2.5/onecall?&lat='+lat+'&lon='+lon+'&exclude=alerts,minutely&units=metric&appid='+apiKeyWeather+'&lang=en&cnt=7'; https.get(urlWeather, function(response){ response.on("data",function(data){ let weatherData = JSON.parse(data); console.log(weatherData); }) }) })En Nodo, los datos de solicitud HTTP/HTTPS pueden llegar en varios fragmentos que deben fusionarse antes de analizar la cadena JSON resultante.
Esencialmente, el análisis de JSON debe realizarse en un on("end", callback) , no en un on("data", callback) , o corre el riesgo de texto JSON incompleto.
La documentación del nodo tiene un excelente ejemplo de trabajo para obtener datos JSON en http.get(options[, callback]) . Esto no parece estar duplicado en la sección HTTPS de la documentación debido a las similitudes de las API de HTTP y HTTPS .
Los datos de respuesta de Https se recopilan en pequeños fragmentos, por lo que cuando se recopilan datos ("on"), debemos agregar los datos (cadena) en la variable (comenzando con una cadena vacía [aquí let chunks="";])
Cuando se recopilan todos los fragmentos de datos ("fin"), finalmente debemos analizar la cadena (datos API) en formato JSON.
https.get(apiLink, function (response) { let chunks=""; response.on("data", function (chunk) { chunks+=chunk; }); response.on("end", function(){ // console.log("API Data recieved"); let defaultCovidData = JSON.parse(chunks); // code after parse string into JSON format }); });