He visto las otras preguntas sobre este tema, pero mi problema es ligeramente diferente: tengo una llamada axios dentro del .then de otra llamada axios, y luego tomo valores de la API que llamé con axios y en otro .then renderiza una página ejs, pero la primera vez que ejecuto, intenta renderizar la página antes de que se completen las llamadas axios, por lo que las variables para construir la página no están definidas, en particular, imprime el error 'h1 no está definido' y h1 es la primera variable en el documento ejs después de nameCapitalized que, como puede ver en el código, es de la solicitud y no de la llamada axios api; a partir de la segunda funciona perfectamente, cuando funciona imprime en orden las sentencias console.log en .then, por lo que el orden de ejecución es el correcto, al menos a partir de la segunda ejecución. Esta solicitud de obtención se realiza después de hacer clic en un enlace en el navegador.
Aquí el código:
app.get('/private_:city/', function(req, response) { const name = req.params.city; const nameCapitalised = name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); let lat; let lon; let country; let jsonObj; let h1; let w1; let t1; let uv1; let rp1; let ws1; axios.get(`http://api.openweathermap.org/geo/1.0/direct?q=${nameCapitalised}&limit=1&appid=${apiKeyOpenWeather}`) .then(res => { console.log('first'); lat = res.data[0].lat; lon = res.data[0].lon; country = res.data[0].country; console.log(res.data[0]); axios.get(`https://api.openweathermap.org/data/2.5/onecall?lat=${lat}&lon=${lon}&exclude=daily,minutely&units=metric&lang=it&appid=${apiKeyOpenWeather}`) .then(res => { console.log('second'); jsonObj = res.data; h1 = new Date(jsonObj.hourly[0].dt * 1000).getHours(); w1 = jsonObj.hourly[0].weather[0].description; t1 = jsonObj.hourly[0].temp; uv1 = jsonObj.hourly[0].uvi; rp1 = Math.trunc(jsonObj.hourly[0].pop * 100); ws1 = jsonObj.hourly[0].wind_speed; }) .then(res => { console.log('third'); response.render('private.ejs', { title: nameCapitalised, t1: t1, h1: h1, w1: w1, uv1: uv1, rp1: rp1, ws1: ws1, }); }); }); });Trate de usar solo entonces...
app.get('/private_:city/', function(req, response) { const name = req.params.city; const nameCapitalised = name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); let lat; let lon; let country; let jsonObj; let h1; let w1; let t1; let uv1; let rp1; let ws1; axios.get(`http://api.openweathermap.org/geo/1.0/direct?q=${nameCapitalised}&limit=1&appid=${apiKeyOpenWeather}`) .then(async (res) => { console.log('first'); lat = res.data[0].lat; lon = res.data[0].lon; country = res.data[0].country; console.log(res.data[0]); return await axios.get(`https://api.openweathermap.org/data/2.5/onecall?lat=${lat}&lon=${lon}&exclude=daily,minutely&units=metric&lang=it&appid=${apiKeyOpenWeather}`)}) .then(res => { console.log('second'); jsonObj = res.data; h1 = new Date(jsonObj.hourly[0].dt * 1000).getHours(); w1 = jsonObj.hourly[0].weather[0].description; t1 = jsonObj.hourly[0].temp; uv1 = jsonObj.hourly[0].uvi; rp1 = Math.trunc(jsonObj.hourly[0].pop * 100); ws1 = jsonObj.hourly[0].wind_speed; }) .then(res => { console.log('third'); response.render('private.ejs', { title: nameCapitalised, t1: t1, h1: h1, w1: w1, uv1: uv1, rp1: rp1, ws1: ws1, }); }); }); });Creo que deberías intentar cambiar el orden de las variables en el documento ejs para entender si es un problema de 'h1'