tplive / weather-wars

"Weather Wars" er arbeidsnavn på en applikasjon som sammenligner værforhold og rangerer resultater
MIT License
5 stars 1 forks source link

geocodeThis returnerer ikke lat, lng objekt #9

Closed tplive closed 5 years ago

tplive commented 5 years ago

https://github.com/tplive/weather-wars/blob/b2eca3ed94a44db22ff29a259d046e88375ce384/gcloud-appengine/app.js#L35

ProgrammerChris commented 5 years ago

Får en timeout error noen sekunder etter at siden er lastet. Aldri jobbet med Express før, eller Node. Men prøver i det minste.

tplive commented 5 years ago

Så bra! Beste måten å lære på det, å prøve! :) Har du hentet ned dependencies med npm install og starter du appen med npm start

ProgrammerChris commented 5 years ago

Jada får appen til å kjøre og lagt inn API nøkkel, men får bare Error, etter å ha gjort kall til API går det noen sekunder før Debugger(bruker VSCode) viser at det kommer en error og ikke response i funksjonen inne i geocode(). Erroren er timeout. Ser i API Dashboard hos google at jeg gjør kall til APIet, men at det er 100% error rate.

tplive commented 5 years ago

Ok, tenkte at siden du skrev at du ikke har brukt express før, at jeg skulle nevne basics.. 😊 Er ikke noen guru selv, men lærer underveis! 👍 Jeg får responsobj med lokasjon fra Google, og jeg får parset ut koordinatene inne i geocode() funksjonen, men de dataene blir ikke returnert fra funksjonen, ser nesten ut som jeg ikke har en return-statement, den returnerer bare undefined. Må se mer på det i morra tror jeg.. :)

ProgrammerChris commented 5 years ago

Ja ikke meninga å virke brå tilbake :P Takker for all hjelp :)

Men du får da ut LanLet i Console vindu?

Returnerer undefined her også, også går det noen sekunder så får jeg en error på den nesta abstrakte funksjonen.

tplive commented 5 years ago

Får ut lat, lng i console ja, hvis jeg kaller den fra geocode() funksjonen. Men funksjonen returnerer bare undefined.. :-/

ProgrammerChris commented 5 years ago

Vet wha issuen er. Må bruke async/await eller promise for så å returnere da. Og vente med å console.log til promise er resolved. Slet med det samme i den Yr xml til json formattereren jeg koda igår/natt 😅

ProgrammerChris commented 5 years ago

Har nå prøvd å bruke async/await og new Promise og å bare auto wrappe i promise, men får bare "timeout" fra Google API, etter laaang tid( sikkert rundt 1 minutt før svar) Skjønner ikke korfor. Får derfor ikke testet om dette virker. Men skal jo egentlig fungere med callback funsjonen du har i funksjonen orginalt... Skjønner ikke dette. Virker for meg som et dårlig API også. Jeg har iallefall 100% error uansett hvilken API nøkkel jeg bruker, får "Timeout" uansett.

tplive commented 5 years ago

Spurte min gode venn (og JS-guru) om dette og han har funnet feilen. Vi prøvde også med async/await først, men API'et til Google returnerer ikke en promise, derfor funker ikke dette. Dersom vi i stedet skriver om funksjonen til å bruke Google sitt API direkte (https://maps.googleapis.com/maps/api/geocode/json?address=Mathias+Lunds+gate,Stjørdal&key=your-api-key-here ), får vi det som vi vil og vi kan returnere en promise og vi kan async'e app.get metoden istedet. Da fjerner vi dependency på google-pakken også. Jeg tror jeg finner tid til dette i ettermiddag/kveld.. :)

ProgrammerChris commented 5 years ago

Er nok bedre å kalle API direkte da ja :) Får din måte til å returnere Promise også, ved å legge til slik når man lager Clienten:

const googleMapsClient = require('@google/maps').createClient({
  key: API_KEY,
  Promise: Promise
});

Også fjerner callback også legger til asPromise() og videre .then() og .catch() for errors:

function geocodeThis(address) {
  googleMapsClient.geocode({
    address: address
  }).asPromise()
  .then(response =>  {response.json.results})
  .catch(err => {console.log(err)});
}

ref: https://stackoverflow.com/questions/26096030/adding-a-promise-to-a-google-maps-api-call

Men som du skriver over er nok direkte API kall best :) Fikk bare timeout med den metoden over, men prøv gjerne denne også bare for å se om det virker. Kjekt å prøve forskjellige veier :)

tplive commented 5 years ago

Har testet å skrive om funksjonen nå, men nå returnerer den [object Promise], så er ikke helt i mål enda. Pusher det bare opp nå, for jeg må ta opp tråden igjen hjemme.. :)

ProgrammerChris commented 5 years ago

Det er jo et steg i rett retning. Prøvd dette på det objektet?

 .then(location => {
    console.log(location);
});
tplive commented 5 years ago

Fant ut av det til slutt. geocodeThis funksjonen returnerte et Promise, så da kan man kalle .then() direkte på den for å få funksjonen kjørt.

Jeg merget og slettet branchen jeg jobbet på, er ikke så glad i brancher som lever så lenge. :)