NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 4 - Kompletní RESTful API v Node.js

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Míla Skipper Moravec:26.4.2019 18:28

Stále jsem přemýšlel, proč mi nefunguje metoda POST. A odpověď je, že na tvým řádku máš

app.post('api/movies', (req, res) => {

ale má být

app.post('/api/movies', (req, res) => {
 
Odpovědět
26.4.2019 18:28
Avatar
Petr Sedláček
Tvůrce
Avatar
Odpovídá na Míla Skipper Moravec
Petr Sedláček:26.4.2019 18:38

Vidíš, díky!
Opravím to.

 
Odpovědět
26.4.2019 18:38
Avatar
jindrich.jokel:15.5.2019 13:50

super clanky bruh, planuje i nejake dalsi pokracovani?

 
Odpovědět
15.5.2019 13:50
Avatar
Lukáš Korel:5.8.2019 12:38

Jde nějak získat více parametrů při volání GET?, kdybych chtěl vracet objekt, jehož vyhledání závisí na 2 parametrech (pro jednoduchost výpočet obsahu obdélníku, API by bralo 2 parametry např. http://localhost:3000/…ngle/a=2,b=3 (nebo jak jinak to zapsat)

Děkuji za informaci

 
Odpovědět
5.8.2019 12:38
Avatar
Odpovídá na Lukáš Korel
Tomáš "chlastyml" Kacálek:10.9.2019 15:03

Ahoj Lukasi,
jednoducha odpoved: NE! :D

Slozitejsi popis: Zde se jedna o url adresu. Teoreticky muzes vytvorit routu, kde budes mit v ceste dva parametry timto zpusobem (oddelene pomoci / ):

app.get('/:first/:second', (req, res) => {
    console.log(req.params.first);
    console.log(req.params.second);
    //...

Ale doporucuji ti to nepouzivat! Ja vlastne nedoporucuji vubec cpat informace do url parametru.
**Proc? **
Nejdrive si musime vysvetlit, ze express funguje na principu prvni deklarace vyhrava. To znamena, ze kdyz definuji routu (napr.: pro status a odeslu 'OK')

router.get('/status', (req, res) => {
    res.send('OK');
});

pote nekde dal v kodu definuji routu se stejnou cestou napr.

router.get('/status', (req, res) => {
    res.send('KO');
});

Tak po zavolani teto routy se spusti vzdy ta prvni definovana (tj. vzdy se vrati 'OK');
Ale proc to vubec rikam:
Kdyz se definuje routa s promenym parametrem napr:

app.get('/api/movies/:id', (req, res) => {
    // some logic
});

a pod to definujes treba:

app.get('/api/movies/all', (req, res) => {
    // some logic
});

Tak pro tu all se ti nikdy nevykona. To by si je musel definovat opacne, nebo udelat neco takoveho:

app.get('/api/movies/:id', (req, res, next) => {
    if(req.params.id === 'all') {
        next();
    } else {
        // some logic
    }
});

ale to je na jine povidani! (takze s tim si nemusis delat hlavu pokud si na to jeste nenarazil. Jiank takhle nejak se pisou ty Middlewares).

Summary: Takze kazdym takovym url parametrem si zavres vetev pri vytvareni route path.


A ted konecne Reseni: To co ty urcite hledas jsou query params. Velice uzitecna vec! jsou to parametry za url adresou (od url oddelene otaznikem a mezi sebou oddelene carkou).
Priklad:

http://localhost:3000/path?param1=value1,param2=value2

a pri definici chovani routy:

router.get('/path', (req, res) => {
    // v promene req.query.param1 je shovane "value1"
    // v promene req.query.param2 je shovane "value2"
});

Tak doufam, ze jsem ti pomohl :) Kdyby neco ptej se :)

PS: jsem se nejak rozkecal xD

Editováno 10.9.2019 15:03
 
Odpovědět
10.9.2019 15:03
Avatar
Karel Paulík:29.6.2020 9:07

Když se požadavky posílají na stejnou adresu, jak server pozná co má udělat.
Např.
get: app.get('/api/mo­vies/:id'
delete: app.delete('/a­pi/movies/:id'
Jak server pozná, jestli má vrátit dotaz na film, nebo film smazat? Pokud by byl get např. app.get('/api/mo­vies_get/:id' a deleta např. app.delete('/a­pi/movies_del/:id' tak by to bylo jané, ale při stejné adrese ne.

 
Odpovědět
29.6.2020 9:07
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na Karel Paulík
Radek Veverka:29.6.2020 10:12

URL adresa není vše, co se serveru posílá. Hned začátek HTTP requestu obsahuje typ requestu - GET, POST, PUT, DELETE...

 
Odpovědět
29.6.2020 10:12
Avatar
Karel Paulík:29.6.2020 10:48

Jj, to jsem si neuvědomil. Díky

 
Odpovědět
29.6.2020 10:48
Avatar
Radek Myška
Člen
Avatar
Radek Myška:10.9.2020 15:59

od verze16 není Joi.validate() podporovano proto se musí opravit vytváření schema a volaní validate() přímo nad schema např takto:

function validateMovie(movie) {
  const schema = Joi.object({
    name: Joi.string().min(3).required(),
    year: Joi.number(),
  });

  return schema.validate(movie);
}
 
Odpovědět
10.9.2020 15:59
Avatar
David Koníček:23.9.2020 10:20

Tohle by bylo dobré, kdyby autor Petr Sedláček upravil, aby nebylo potřeba to hledat v komentářích.

Editováno 23.9.2020 10:21
Odpovědět
23.9.2020 10:20
Věř, běž a dokážeš!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 26.