25. dan (5. teden) - tanka razlika med naslednjim () in vrnitvijo naslednjega ()

Preden pridem do razlike med klicanjem naslednjega () in vrnitvijo naslednjega (), želim povzeti dan.

Naša običajna petkova hrenovka je obsegala nekaj napovedi, nekaj informacij o kariernih storitvah in načrtu, ki se dogaja naprej, in nekaj predstavitev projektov, ki smo jih delali. Misel je, da s predstavitvijo naše kode boljše govorimo o kodi. Mislim, da je to zelo dobro storiti, le želim si, da bi imeli več časa za to. Eden izmed mojih predlogov je, da imamo na Githubu več uradnih pregledov kode, ki jih lahko uporabljamo z istimi orodji, ki jih bomo najverjetneje uporabili na delovnem mestu za pregledovanje in komentiranje kode drugih ljudi.

Imela sem tudi lepo srečanje med seboj o svojem življenjepisu in spremnih pismih za podjetja, na katera se želim prijaviti. Vsi so tako organizirani in obveščeni o tem, kako napreduje proces. Lahko povem, da obstajajo globoke izkušnje in znanje o tem, kako najti zaposlitev pri razvoju programske opreme. Upam, da bom te podatke lahko uporabil in jih uporabil pri iskanju zaposlitve na koncu tega usposabljanja.

V redu, glede na razliko med klicanjem naslednja () in vrnitvijo naslednjega (). To sem prvič opazil pred nekaj dnevi, ko sem delal nekaj primera kode v nočnih domačih nalogah. Express uporabljamo za določanje poti, in to, kar sem videl, je bilo nekaj takega.

app.get ('/ post', funkcija (req, res, next) {
  Post.findById (1234) .then (funkcija (post, napaka) {
    če (napaka) {
      vrnitev naslednja (napaka);
    }
    če (! objava) {
      var notFound = nova napaka ('Objave ni mogoče najti!');
      notFound.status = 404;
      vrnitev naslednja (notFound);
    }
    res.send (objava);
  });
});

Tu obravnavamo zahtevo GET na poti / pošti. V povratnem klicu se zdi, da kličemo na Post.findById, kar je verjetno poizvedba po bazi podatkov. Ker gre za dostop do zbirke podatkov in vrnitev obljube - kar je jasno po uporabi .then - poglejmo znotraj te funkcije. Konkretno vidimo, da če je (napaka) resnična, se pokliče naslednji vrnitev (napaka). Po tem imamo še en if (! Post), ki se spet vrne naslednji (notFound), in na koncu, če nismo dobili nobene napake in ima post nekaj podatkov, pokličemo res.send (post), ki pošlje rezultat poizvedbe baze podatkov nazaj v brskalnik.

V drugih primerih bi videl nekaj takega.

app.get ('/ foo',
preverjanje funkcijeRegistracija (req, res, next) {
  če (! req.user.registered) {
    // Če se uporabnik ni registriral, preskočite na naslednjo pot.
    // getRegistration se ne izvede.
    naslednji ('pot')
  }
}, funkcija getRegistration (req, res, next) {
  Registration.find (funkcija (napaka, podatki) {
    če (napaka) vrne naslednji (napaka)
    res.json (podatki)
  });
});

V tem primeru le kličemo na naslednji ('route'). Seveda je naravno vprašanje, kakšna je razlika med uporabo vrnitve ali ne?

Kot sem danes ugotovil, se zdi, da klic na naslednji () znotraj poti NE takoj zapusti funkcije in nadaljuje na naslednjo pot. V tem primeru se oceni preostanek poti in ker je bil poklican naslednji (), ni treba razrešiti zahteve in lahko preprosto preidemo na naslednjega ujemajočega skrbnika poti.

Hitro na stran: ne pozabite, da če ne rešite zahteve znotraj poti, Express ne bo poslal ničesar nazaj v brskalnik in boste ostali obešeni.

Torej, če pokličete next () od znotraj poti, preprosto povejte Expressu, da naj nadaljuje z ostalim delom poti in nato nadaljuje na naslednjo ujemajočo se pot.

To primerjajte s klicem return (()) () znotraj poti. Ključna razlika je v tem, da ko pokličete return next (), izvedba takoj zapusti funkcijo in nadaljuje na naslednjo ujemajočo se pot. To je podobno obnašanju metanja izjeme. Na naši poti se je nekaj zgodilo in želimo preskočiti katero koli preostalo kodo na poti in skočiti na naslednjo ujemajočo se pot.

Moja današnja težava je bila v poskusu izvajanja poizvedbe v MongoDB, kjer so za mojo aplikacijo shranjena vsa moja uporabniška imena in gesla. Ko sem prišel do zahteve POST, ki je prejela uporabniško ime in geslo, ki ga je stranka pravkar poslala, moram opraviti poizvedbo, da vidim, ali je v bazi podatkov ustrezen zapis. To je asinhroni klic s funkcijo povratnega klica. Kar zadeva Express, še naprej izvaja mojo kodo, medtem ko čaka, da se rezultat vrne iz baze.

Izkazalo se je, da je to zame slabo. Ker Express čaka, da se podatki vrnejo iz baze podatkov, se izvajanje nadaljuje in začnem videti to sporočilo o napaki.

Napaka: Glasov po pošiljanju ni mogoče nastaviti.

To je Express še naprej, ko tega resnično nisem hotel. Uporabljal sem uporabo next (), ko sem si resnično želel uporabiti return next ().

Danes se zavedam tega je bilo zame ogromno. Lepo je dokončati odprto zanko pred nekaj dnevi in ​​se spraševati, kakšna je razlika v obeh klicih. Zdaj se lahko vrnem in počistim kodo za ta projekt.

Še zadnja stvar - nov tedenski projekt je bil objavljen danes. Zakodirati moramo spletno stran, ki omogoča igranje klasične igre Hangman. Tega se bom spoprijel ta konec tedna! :-)