Node/Express.js, získanie return hodnoty z funkcie v inom module
Dobrý deň,
vyrábam prekladač v Node.js, na preklad využívam cloud API, ktoré sa volá cez funkciu, ktorá robí axios post request. Táto funkcia aj preklad fungujú bez problémov. Preklad, teda Response, chcem uložiť do vlastnej premennej (let x), vrátiť túto premennú (return x), a v hlavnom module server.js jej hodnotu nejako odchytiť a odoslať ako JSON (res.json(x)), aby som z tým vedel dalej pracovať na views/index.ejs. Problém je, že preklad zbehne v pohode (viem to podla toho, že som skusal vypísať console.log(res)), no v server.js po odoslaní POST requestu (zatial iba v aplikacií POSTMAN) vypíše x ako undefined.
Môže mi niekto poradiť ako by som to mohol upraviť aby to robilo to, čo som napísal. Pre lepšie pochopenie a štruktúru apky, kt. vyrábam som nahral aj obrazky priamo z editora. A pre lepšie info, ked robim ten request, server na localhoste je samozrejme zapnutý, aj index.ejs sa vyrenderuje. Len to x je furt undefined.
P.S. viem, že by sa to dalo urobiť jednoducho na front-ende v js, ale chcem ten axios robit na backende, lebo v budúcnosti sa module translator.js má rozširovať o dalsie funkcie, validovať dáta a aj zapisovať na databázu.
v programovaní som začiatočník, takže ak robím nejakú smiešnu chybu... nesmejte sa mi.
OS: Windows 10 Home
editor: VSCode
Musíš počkat až dostaneš odpověď od serveru. Teď tu hodnotu vracíš okamžitě, bez čekání.
Takže použij Promise pomocí await.
A dávat kód jako obrázek není dobrý nápad, text je vždy lepší.
zapisal som celu funkciu asynchronne cez async, await, try, catch, no teraz to dava chybu ze x nieje definovane v server.js. Posielam kody obidvoch .js suborov, vies mi to preprogramovat tak že by mi to šlo, pls?
Tu hodnotu teď ale nikde nevracíš. A i kdybys vracel, tak ji nikde nepoužíváš.
v translator.js som pridal pod ten console.log(x) na dalsi riadok return x; stale rovnaka chyba. x nieje definovane. Ale preco neni? Ved x je sucastou tej funkcie a pouziva sa v server.js, teda tam sa ma vypisat.
Celu funkciu som exportoval do server.js, takze vsetko co je zname v nej by malo byt aj v server.js, ci?
"x" máš deklarované ve funkci translate, takže nikdo jinde není viditelné.
server.js vracia teraz prazdny objekt
tu funkciu v translator.js mam takto:
Pravda. Asynchronní volání je potřeba zpropagovat "nahoru".
Takze x sa konecne vypisuje. Vdaka. Len ono je to cele k nicomu ked to nejde odoslat ako json.
chyba:
skusal som to zapisat aj cez try a catch priamo v tom post route, no stale rovnaka chyba
No a co je teda v tom "x"?
nejde to rozkliknut, lebo to vypisuje do terminalu VSCode, ale ide asi o klasický json
Vypisuješ x.data ale vracíš x?
teraz ano, to len pre ukazku, lebo ste chceli vediet co je v "x". Ide normalne vypisat aj console.log(x), len to vypise velky objekt dat z udajmi o requeste. Nemyslim si, ze je to podstatne, ci tam je x alebo x.data.
A ano, funkcia v translator.js vracia iba to "x". A pokial tomu dobre rozumiem... tak to "return x;" v tej funkcii sa moze volat aj "return y;" nie? Za predpokladu, ze zmenim nazov vo funkcii z "x" na "y".
No podstatné je to docela dost. Měl bys vracet jenom to, co opravdu chceš, a ne kompletní "obálku" okolo.
Tak samozřejmě můžeš změnit x na y. Ale to ti ten problém nevyřeší.
No ano, funguje vzdy iba x.data a je jedno ci x.data vratim priamo z funkcie, alebo vratim x a vypisem res.json(x.data); Proste cele x nejde vypisat a ja by som praveze potreboval dostat cele x to z toho dovodu, ze mne netreba z toho response len prelozeny text ale aj ine udaje, kt. niesu v data, ale napr. v headers, alebo inde (neviem kde). To by som zistil ak by som vratil vsetko v x a pozrel sa co mi treba a co nie.
Napr. to API ktore pouzivam ma obmedzeny pocet requestov, ktory je mozne vykonat (za 1 mesiac/max. 50 000 req.). No a chcel by som pri kazdom requeste mat prehlad o tom kolko este ich mozem tento mesiac urobit...atd.
Preco nejde vypisat "celu obalku"? Lebo do terminalu VSCode praveze zo zaciatku vypisovalo celu obalku bez problemov.
A teraz skusam, ide aj x.headers vypisat, kde vidim ostatne udaje, ale preco nejde cele x to nechapem, furt dava tu istu chybu...
Máš to v té chybové hlášce. Ten objekt x obsahuje nějakou kruhovou referenci a proto nejde serializovat do JSON stringu. Takže si z toho budeš muset vytahat pouze údaje, které potřebuješ, a teprve ty serializovat.
hmm... predsa asi ide... zatial skusam iba cez ten postman, ale da sa naraz vypisat aj data, aj headers aj ostatne... takto:
odskusane a funguje, inac urobil som si ten response normalne na front-ende v js a kde ide do konzole prehliadaca vypisat cely response tak ako pride a nic okrem toho vyssie v nom neni.
Takze pre zatial by mohol byt moj problem vyrieseny. A dakujem za pomoc.
Jde to jenom proto, že nevracíš kompletní x. Tím roztrháním jsi nejspíš roztrhnul nějakou referenci a teď už tam není kruh.
Mam este jeden problem, nejde importovat axios do main.js. axios je nainstalovany cez npm v node_modules/axios
skúsal som vybrat aj ine subory v tej axios zlozke, ktore tam su no nejde ani jeden, a aj import axios from "axios"; som skusal no stale dava v prehliadaci tu istu chybu.
ten axios.get je len na odskusanie ci funguje, inak chcem vykonat post request na tie data co som vratil tiez cez axios na backende.