Den 25 (5. týden) - Jemný rozdíl mezi dalším () a návratem ()

Chci shrnout den před určením rozdílu mezi voláním next () a next ().

Náš typický páteční rozhovor se skládal z několika oznámení, kariérních služeb a plánů pokroku a několika prezentací, na kterých jsme pracovali. Poskytnutím naší zpětné vazby zlepšujeme naši konverzaci o kódu. Myslím, že je to dobrá věc, rádi bychom s tím strávili více času. Jedním z mých návrhů, jak postupovat vpřed, je přezkoumat úřední kódy v Githubu, naučit se používat nástroje, které používáme k prohlížení a interpretaci kódů jiných lidí na pracovišti.

Měl jsem osobní setkání o svém životopisu a požádal jsem o dopisy společnostem, o které jsem se chtěl ucházet. Všichni jsou tak organizovaní a vědomi toho, jak postupovat kupředu. Mohu říci, že mám hluboké zkušenosti a znalosti o tom, jak najít práci ve vývoji softwaru. Doufám, že mohu tyto informace získat a použít je k nalezení zaměstnání na konci tohoto školení.

O rozdílu mezi voláním next () a next ()) jsem si to poprvé všiml před několika dny, když jsem pracoval v nočních kódech domácích úkolů. Bylo to tak.

app.get ('/ post', function (req, res, next) {Post.findById (1234) .then (function (post, err) {if (error) {návrat next (err);} if (! post ) {var notFound = nová chyba ('Zpráva nenalezena!'); notFound.status = 404; návrat další (notFound);} res.send (post);});});

Zde se díváme na požadavek GET na trať / příspěvek. Při zpětném volání se zdá, že provádíme všechna volání na Post.findById, což je pravděpodobně databázový dotaz. Protože to zahrnuje propojení databáze a vrácení slibu. Poté je jasné - podívejte se dovnitř funkce. Konkrétně vidíme, že pokud (chyba) je pravda, jsme voláni zpět na další (err). Pak máme další (! Post), který se vrací (notFound) a konečně res.send (post), který pošle výsledek, pokud jsme se nedopustili žádných chyb a nemáme nějaké informace ). vrátit databázový požadavek do prohlížeče.

V jiných příkladech bych viděl něco podobného.

app.get ('/ foo', Check CheckRegging (req, res, next) {if (! req.user.registr) {// Pokud není uživatel zaregistrován, přejděte na další cestu // // getRegration selže. next ('route')}}, getRegistration function (req, res, next) {Register.find (funkce (chyba, data) {if (err) se vrací next ( err) res.json (data)});});

V tomto příkladu jednoduše zavoláme ('route'). Takže, přirozená otázka zní: jaký je rozdíl mezi používáním návratu?

Jak vím dnes, další volání () na trase neopustí funkci okamžitě a nejde na další itinerář. V tomto případě je vyhodnocena zbývající trasa a protože se volá další (), není třeba požadavek řešit a jednoduše přejdeme k dalšímu vhodnému obslužnému programu trasy.

Rychle odložte: Pokud nevyřešíte požadavek na trase, nezapomeňte, že Express do prohlížeče nic neposílá a zavěsí vás.

Volání dalšího () čísla z trasy jednoduše řekne Express, že zbytek trasy by měl pokračovat a přesunout na další vhodnou trasu.

Porovnejte to s dalším () hovorem na trase. Důležitý rozdíl je v tom, že když zavoláte next (), provedení okamžitě opustí funkci a přejde na další odpovídající cestu. Vypadá to jako výstřel výjimky. V naší itineráři se něco stalo a my chceme pouze přeskočit zbývající kód na trase a prostě se přesunout na další vhodnou trasu.

Mým problémem bylo pokusit se odeslat požadavek do MongoDB, kde jsou všechna moje uživatelské jméno a heslo uložena pro mou aplikaci. Když dostanu požadavek POST, aby klient měl uživatelské jméno a heslo poskytnuté jím, musím spustit dotaz, abych zjistil, zda v databázi existuje odkaz. Jedná se o asynchronní volání s funkcí zpětného volání. Pokud jde o Express, bude pokračovat v provádění mého kódu a čeká, až se vrátí z databáze.

To znamená, že je to pro mě špatné. Protože Express čeká na návrat z databáze, probíhá proces a zobrazí se chybová zpráva.

Chyba: Po odeslání nelze záhlaví nainstalovat

Tato rychlost Express bude pokračovat, když to opravdu nechci. Když jsem chtěl použít return next (), použil jsem next ().

Bylo pro mě příliš velké, abych si to dnes uvědomil. Ohromen tím, jaký je rozdíl mezi těmito dvěma zvonky, a je příjemné ukončit cyklus, který se otevřel před několika dny. Nyní se mohu vrátit a vymazat svůj kód pro tento projekt.

Ještě poslední věc - dnes vyšel nový týdenní projekt. Musíme zakódovat webovou stránku, která vám umožní hrát klasickou hru Hangmana. Udělám to tento víkend! :-)