>> Så, med detta sagt,
bara typ av en enkel introduktion till prototyper
och JavaScript-objektmodellen.
Vi kommer inte att flytta växlar lite att prata
om mer JavaScript på servern och Bookshelf biblioteket
och anslutningen Knex Library.
Så kan du faktiskt bara -
om du söker efter Bookshelf.js det borde vara ganska lätt
att hitta, bör först resultatet och bokhylla
som David nämnde just ger mycket struktur
runt JavaScript-objekt och arbeta med dem relationally
i relationsdatabaser.
Så, en hel del liknande funktioner vem är faktiskt starkt inspirerad
genom Laravel s ORM som samt Backbone.js,
vilket är en främre ände MVC bibliotek som gör att du
att strukturera din kod, liknar vad jag visade
med exemplen enligt prototyper där du kan -
istället för att bara godtyckligt kasta klasser
på dina åsikter här och där.
Det ger dig modeller och samlingar av dessa modeller
som är tänkta att fungera som typ av en enda sanning
om data för din ansökan.
Och då du lyssnar på, som de som modeller förändringar, säger du, OK,
åter göra den här mallen här och här hit
och inte bara lägga klass här, lägga klass där och sorts plocka
på väljare och göra spindelnät av jQuery kod.
Det ger mer av en klassbaserad struktur till enskilda bitar,
men en viktig komponent i att biblioteket är modellerna
som har en liknande struktur vad bokhylla modeller gör.
Så, om du är bekant med Bokhylla du är ganska också
ganska bekant med Backbone.js modeller,
och jag skulle rekommendera ta en titt på detta.
Så, några av de viktigaste funktionerna
att det ger dig är bara förmåga att sätta uppgifter på ett objekt
ringa fetch, vilken returnerar en enskild post
från databasen, skapa relationer som liknar
vad du behandlas inom i Laravel
där du kan säga en Patienten sätta rekord metod
och säga att detta har vunnit rekord
där posten objektet är bord namnpatientjournaler.
Låt oss se.
Har många - det hör till -
bara saker som du är ganska lika -
ganska bekant med redan, men i JavaScript.
Och under huven, för bokhylla,
den använder en frågeverktyget kallas Knex.js.
Så, det är Knex, knexjs.org.
Det är en referens till leksaken om någon någonsin spelat med det här.
Men det kan du - i en liknande sätt till jQuery,
du bara sorts skapa en kedja av olika metoder
att du ringer på din databas rad så att du kan -
du började med att säga Knex och tabellnamnet.
Så, till exempel, Knex användare, Välj vilka kolumner du vill ha,
där, och har olika där villkorssatser och du kan ha
OCH där, eller om, där mellan, där inte,
du nu, fram.
Du kan ange olika förenar mellan databastabeller
som bokhylla använder internt att upprätta sorts magi
runt hasOne, hasMany, Tillhör, belongsToMany.
Och så kombinationen
av de två kan du göra ganska mycket vad du skulle kunna användas
i ramen som Laravel i termer
funktionalitet att arbeta med databaser.
Så, låt oss gå vidare och ta titta på ett enkelt exempel
för en Express app som använder sig av dessa modeller
och samlingar av Bookshelf jazz [fonetisk].
Så har jag satt upp bara en enkel tillämpning här.
Jag strippad ut några av de saker som initieras express
och flytta den till en init katalog som jag skapade.
En av de fina sakerna arbetar med Express som tänkt
till Laravel är att det finns verkligen inte mycket verk
om du conventionalized.
Så du kan skapa kataloger -
det egentligen inte ger dig en hel del att arbeta bort av.
Du har bara sorts några grundinställningar och sedan -
men det bryr sig inte var du lagt dem.
Du behöver inte ha controller katalog.
Du behöver inte ha en modeller katalog, en config.
Du kan sorts skapa dem som dina projektbehov
och ställa in saker på det sätt det vettigt mest för dig.
Så istället för att ha alla denna uttryckstandardtext
i huvud app.js jag sa app jämlikar kräver init / express.
Och så i init,
den initierar mapp Jag har Uttryck här,
och detta kräver Express, samtal inställningsfunktionen anropar -
sätter upp vyn motor, JSON parser, allt det där.
Så nu ska vi fortsätta ner.
Så jag kräver kursledaren möte
och krav modeller.
Så dessa är i en mapp som Jag just beslutat att namnmodeller.
Det behöver inte vara att sätt men det är vettigt,
men modellerna är bara ganska vanligt så jag skulle rekommendera det.
Men - Så låt oss gå för kursen.
Jag tror att jag använder - Ja, och de exempel
här nere är alla baserade kring kursmodellen.
Så låt oss bara ta en titta på det.
Så, nu, bara för första raden i denna modell,
Jag är redan kräver något annat.
Så om du kommer att märka i nod du bör kräva
eller du kommer att hamna kräver en hel massa
olika filer som är belägna
på olika platser i din ansökan.
Och de relativa sökvägar till var du än är
i den aktuella ansökan,
såvida det inte är en övre nivå som redan definieras som i den installeras
med MPM som bokhylla eller Knex eller Express eller något,
de är inte relativ.
Ja? Zooma in mer?
OK. OK. Så, du kommer att sluta kräva en hel massa
av just olika filer i din kod, vilket är bra och dåligt.
På ett bra sätt du vet var saker är och det är inte sorterar
av magi som vad är händer under huven,
som verkligen kan vara förvirrande
när du har en mycket tung Java -
eller mycket tunga ramar som Laravel, vilken sorts säger,
vi ska ta hand av detta så att du inte har
att kräva allt men du har
att veta hur allt fungerar för att använda den.
När som i detta fall, är det mycket enkel att
där allt är, de är bara ändarna
upp att vara lite mer att skriva.
Precis som i den sida jag gillar att använda, det finns en plugin
om du använder en blind text
där du kan installera noden moduler hjälpare och du kan börja
att skriva ut som instruktör och det skapar den relativa sökvägen
till där du är den som code-fil, typ av användbar.
Så, kursmodellen finnas fordra bas här
och sedan bas praktikant kräver init / bokhylla
och sedan bokhylla, det kräver att den översta nivån bokhylla
och sedan initierar den med det initierade Knex exempel
som sätter kundens namn
och anslutningen inställningar för databasen.
Så jag bara med en enkel instans av Sequel Pro som -
av MySQL, jag komma åt den med Sequel Pro och den har bara typ
av en liknande databas inställning som vi hade
i det första provet ansökan med kurskatalogen.
Så jag satt min anslutning inställningar här,
och dessa är alla dokumenterade på Knex.js projektsida
om hur man ställer in dessa anslutningar.
Så, jag nu har min bas modell.
Och som jag nämnde med prototypen förändring,
så det kan faktiskt vara lite av en hel del till -
tillför en hel del standardtext till din kod så konvention
som har anpassats genom Backbone.js
och nu Bookshelf.js är att lägga till detta utöka metod
som en statisk egenskap på dina JavaScript-objekt,
vilket ger den en sorts nästan klassbaserat arv natur
där om du ringer utvidga du kan ställa upp någon
av prototypmetoder som du vill här
och sedan kan du - något extra statiska metoder
att du kanske vill, du kan bara ställa dem själva
här ute så jag kan förlänga den med - så om till exempel
flera modeller som behövs visa namn och detta får namn.
Så här, jag säger det visningsnamn för modell
som standard är oavsett namn Fastigheten är annars retur
inget namn.
Och nu på varje modell som är en -
som sträcker sig denna grundmodell, jag Nu har ett visningsnamn metod
på prototypen kedja någonstans.
Och om jag vill skriva över den Jag kan bara ställa in den - ange vad -
getName skulle vara här.
Och det gör att du kan härma klassisk arv
i JavaScript, kan som vara trevlig särskilt för saker
som lämpar sig att vara klass baserad liknande objektmodeller.
Så låt oss gå tillbaka till programkoden.
Så jag har en väg för bara slash, bara för min index
och sedan slash kurser.
Och båda dessa kallar den renderCourses metoden.
Så återigen, funktioner första klass och kan skickas
som argument till metoder.
Så i detta app.get, Jag ringer -
Jag passerar renderCourses som argument.
Och göra - eller funktioner kan ställas in som var -
som jag gjorde tidigare var renderCourses lika funktion
eller de kan vara lika funktions renderCourses.
Det gör inte alltför mycket av en skillnad.
Du kan faktiskt ha det kallas namn funktion
uttryck, vilka är Var renderCourses jämlikar
funktions renderCourses.
Och anledningen till att vilja ha namnge funktioner särskilt
i noden är att det ger dig en renare -
mer lättläst stackspårning.
Så om du har en hel massa
av anonyma funktioner Det kommer att säga -
när du har ett fel i koden You'Ll -
du kommer inte att veta vilken funktion det kallar du måste se
vid kodnumret och radnumret
och det är ibland lättare bara för att visuellt tolka
när du faktiskt har namn
för de funktioner sig på serversidan.
Så detta renderCourses, låt oss kalla nod apps -
så jag lyssnar på Kärna 3000 [fonetisk].
Och så allt detta är att göra rätt här är bara få alla
kurser från databasen.
Jag är inte ens begränsa det så det gör ett stort antal
rader det återvänder.
Och för att göra detta,
på kursmodell där är en statisk egenskap
kallad samling.
Och så jag bara kalla det - jag sade att skapa en ny samling
för denna kurs, och sedan hämta den,
och sedan tillbaka kurserna samling här på löftet.
Så internt, David - det sista halvan visade lite
om löften och löften är används väldigt mycket i både Knex
och bokhylla eftersom det ger den -
det ger dig Förmågan att ha ett gäng
olika asynkrona samtal och liksom gå sedan tillsammans
eller hämta något, och sedan
med att ringa en annan asynkron databas samtal
och returnera det värdet och sedan hoppa till nästa då
och nästa då och då ha en fånga i slutet för att sortera
av härmare asynkron try catch beteende med asynkron kod,
eftersom du ser det nu
men det är ännu svårare när du börjar att ta itu med det.
Asynkron kod är precis överallt
på serversidan JavaScript och verkligen i mycket högre grad
än vad du är van vid om du har gjort JavaScript
på klientsidan.
Så det verkligen, verkligen hjälpt dig där ute.
Men bara för att visa dig debugger uttalande
som jag talade om i noden inspektör verktyg,
Jag kommer att gå vidare och kasta en debugger linje här
i renderCourses funktion och se vart det leder mig
när jag - så nod inspektör kan installeras
genom att göra NPM Install med en G sjunker,
vilket betyder Global Node Inspector.
Och det kommer att hämta det för NMP och installera det globalt
för dina applikationer så du kan bara kalla det
från kommandoraden.
Jag har redan installerat det så jag ska gå vidare och -
egentligen skulle det ha vänta det kommer bara ta,
ta två sekunder.
Och vilken nod inspektör igen kan du
göra är att ha denna huvudlösa version av debugger konsolen
att du är van vid när man arbetar på klientsidan och kunna
att sluta, bara lägga specificeras pekar i koden.
Stoppa utförande och ta en titta på vad som händer,
vilket skulle ha riktigt komma till hands om funktionen
så där fanns tillgängliga
vid felsökning din PHP-kod jag är säker.
Så låt oss bara ta en titta på det.
Så jag kan bara ringa nod inspektör
och det ska säga besöka denna webbadress port 5858 för att börja felsökning,
det är bara standard för hur den startar.
Så har jag nu fått - det finns ingenting händer här
eftersom jag måste börja.
Så nod dödläge [fonetisk] den debug flagga och sedan app.js.
Så det säger debugger lyssnar på port 5858,
Express-servern lyssnande på 3000.
Så vi är bra att gå.
Låt mig bara uppdatera.
Och nu kan jag se app.js kod som jag tittade bara på
men här i konsolen.
Så nu, om jag försöker köra det här, du kan se det, stannar den.
Det är bara att vänta på grund av dess exekvering hela koden är nu
slutade på detta debugger linje som jag har lagt in där.
Och jag kan nu server -
[Ohörbart Anmärkning]
Oh, ja. Vad är nyckelordet genväg för att zooma skärmen?
Åh det finns.
Uppfattat. OK.
[Paus]
Åh, det är inte ute [Fonetisk] det.
Så, är riktigt stora kurser
eftersom jag inte gör en begränsa klausul eller något,
det är bara att hämta den hela databasen av kurser
vilket är en hel del av dem.
Och så - som är föremål
som faktiskt kan krascha anteckningen inspektör instans.
Det är - OK.
Låt mig göra en gräns och då kan vi ta en titt
när det inte hämta hundratals kurser.
Så, döda servern och inspektör
och jag ska göra kursen samling frågegränsen 20.
Så i bokhylla, till skillnad från i Laravel
där du bara kan ringa begränsa direkt eller ringa någon
av dessa SQL-metoder att du använder
att direkt på ORM instans.
När som helst som du använder just SQL-metod, som är försedd
i Knex, måste du kallar frågan för att sortera
av utnyttja frågekedjan.
Och detta kan åberopas med antingen en funktion,
så du kan säga, funktion denna gräns 10 eller om du kallar det
genom att ange vilka metod som du vill ringa
på Knex instans och sedan vilken värdet.
Så vi kommer att göra begränsa 20 och sedan in.
Vi gör faktiskt inte behöver debugger här
eftersom vi kan bara ange brytpunkter
och det gör det lättare.
Okej.
Så, låt oss sätta en brytpunkt just här och försöka läsa in den.
Fel linje.
Just här.
[Paus]
OK. Så det slutade igen.
Så nu är kurser en invända med längd 20
och vi kan se alla de olika modeller som det är hämtat
från databasen här så jag har en modell objekt
som har, på insidan av attribut egendom
om objektet är allt att det finns i databasen.
Alla händelser som har registrerats
så att du kan registrera olika evenemang,
t ex när Modellen tas bort
eller när det är långsökt,
du kan ställa in olika egenskaper eller ändra saker.
Det finns en massa olika krokar och dessa är alla dokumenterade
i Bookshelf.js dokumentation som gör att du
att göra sorts någonting att du verkligen vill göra
med dina modeller och samlingar.
Du kan - de är avsedda att vara riktigt anpassningsbar
och verkligen lätt för dig att anpassa dem
till behoven i ditt ansökan.
Men bara titta igenom här,
Jag kan se hur de olika kurser finns.
Och i det här fallet, jag faktiskt inte hämta
med någon annan än andra data bara kurserna själva.
Men på liknande sätt som den vältalige ORM du kan ställa in
upp relationer, så kursen tillhör många instruktör.
Så, om jag går vidare och avbryta tillämpningen,
hoppa till detta hämta samtal du kan ange olika alternativ
som du vill passera längs den.
Och en av dem är möjligheten att ladda tillhörande kod
genom att specificera withRelated instruktörer då kurser.
Så låt oss gå tillbaka och fräsch det här och sluta igen.
Så nu, kurserna invända, lika många modeller,
men nu varje modell har relationer hash
som har instruktörerna att det är relaterat till.
Så här kursen till exempel
vilket är naturligtvis 082 har två relaterade instruktör modeller.
Och du kan redan se hur mycket enklare detta är att sortera
av visuellt arbeta med än när du arbetar med saker
att du sortens ändra koden och sedan försöka igen i PHP.
Det faktum att du kan bara stoppa exekvering helt
och utvärdera vad som finns här och den - i konsolen, den -
zooma ut, är kurser, du vet,
vad att den lokala omfattningen variabler är tillgängliga
och det är för närvarande den globala objekt för som du såg det,
om du ringer med en specifika sammanhang, det kommer inte
att ha något relevant här.
Och sedan, det - låt mig visa några fler exempel
genomföra löften.
Så istället för att göra detta withRelated instruktörer Här är jag
kommer att gå vidare och flytta den här för att hämta och sedan kurserna,
Jag kommer att återvända courses.load instruktörer.
Och då - då du ringa då.
[Paus]
Så då på denna punkt, den kurser ska laddas
med instruktörerna, som är asynkron handling.
Men eftersom vi tillbaka det från ett löfte, nästa värde
för då är allt detta asynkrona anropet
som i detta fall belastning är en metod i bokhylla
som faktiskt återvänder insamling självt.
Så det laddar instruktörer på det
och sedan kan du ange - om det är bara en fastighet,
Du kan ange den här som sträng, annars
du kan göra instruktörer och krav
som metod - sorry, som en matris.
Och sedan om du vill få riktigt snygga och begränsa eventuella
av dessa ges FETCH, du kan ange det som en hash
med instruktörer och sedan vad du begränsa frågan om.
Så, jag skulle vilja läsa alla instruktörer på kurser där -
så QB för frågeverktyget där status är aktiv.
Och du kan få riktigt infall med någon
av de relaterade sökfrågor du vill bygga.
Men, bara för nu, vi ska att hålla sig till bara instruktörer
och vi tillbaka det värdet
så då nästa då bör har alla kurser laddade
upp ordentligt.
Och om det fanns ett fel vid varje steg i den kedjan,
det skulle hoppa ner till fångsten.
Så låt oss gå vidare och köra det.
Så varje gång - till skillnad från i PHP, är en nackdel för
"Eftersom nod" är en lång löpning processen, du faktiskt behöver
att stoppa noden processen när du uppdaterar din kod,
eftersom den version som det är körs i tidskörningen är,
den version av kod som var laddad
när den startas inte vad du har sorterings
av uppdaterat din kod med sedan dess.
OK. Vi kommer att sätta en brytpunkt Här, här och uppdatera.
[Paus]
Åh, jag gjorde faktiskt inte uppdatera den här sidan antingen
så det var på den gamla processen.
Så du uppdatera både här och noden inspektören.
Så nu ser vi kurser.
Om vi ​​bara tar prov av en av dessa modeller,
Vi kan se att relationerna Objektet är tom, men nu -
och anledningen till att du behöver att sätta brytpunkter är, väl,
Jag nämnde att du kan hoppa in i stackspårningen
och ser ni vet, där det kommer i appen.
Så nu kan jag se vad som är händer i belastningsmetoden,
som jag har definierat på samlingarna.
It slags "Eager laster relationer på en redan ".
Och du kan stega igenom och se rad för rad
där det här är går vilket är bra.
Om du har något som är brutet i koden,
det är att kasta en del fel och du är som jag verkligen vill ha
för att se om detta kommer.
Men så fort du stöter på något asynkron, den -
den går till nästa tick av händelsen slinga
och du förlorar din - förlorar du din plats
i noden inspektören.
Så du behöver säga, "OK, när jag förlorar detta,
det måste sluta nu på denna linje igen. "
För om jag fortsatte att slå ner, ner i stacken
det skulle till slut bara gått bort hade jag inte satt här
linje 22 blå paus linje.
Så nu, om jag ser på kurser här,
det ska på relation instruktörer
och sedan har det instruktörer bifoga dem.
Så kan du se att jag återvände ett löfte från den första löftet
och sedan kan du hela tiden göra det fram.
Så den annorlunda löfte, lovar bibliotek,
Jag använde en som heter Bluebird vilket är verkligen användbart.
Det tillför en hel del fint i denna för att ändra asynkron -
förändrade ringa tillbaka baskod in grejer
som fungerar bra med löften.
Men - sorry [ohörbart] vad Jag skulle säga det där.
Låt oss ta en titt fast vid -
så låt oss säga att det fanns en Problemet när man hämtar något.
Så jag har den här andra vägen att hitta kallad kurs-ID.
Så låt oss göra kurs 2.
Kan jag få - JSON kurs.
Och detta innebär [ohörbart].
[Paus]
Jag luktar något fel här.
Inte på 3000, jag var på inspektören fliken Chrome.
OK. Så låt oss gå till kurs - JSON kurs 1.
Och detta återvänder precis i JSON format, kursen laddad
upp med några instruktörer.
Men exemplet jag ville att ge här är att,
Jag gör JSON kurs-ID.
Och i de hämta parametrarna, Jag specificerar kräver sant,
vilket är ett alternativ som är dokumenterade i bokhylla
där man säger att "Om, Jag försöker och hitta denna kurs
och det är inte där, sedan kasta ett fel. "
Och som bör omfattas av fångsten blocket här nere.
Så låt oss gå vidare och hoppa tillbaka i noden inspektör och försök
och bryta det här och se vad vi fick.
Så låt oss sätta en paus här på JSON kursen.
Okej.
Jag ska gå till JSON kurs och Jag skulle bara sätta i en del -
[Paus]
Det kan vara lite knepigt Ibland när du försöker
att hantera som en har uppdaterats
och som inte har - låt oss se.
Så det ringer fel tom respons.
[Paus]
Låt oss kasta en debugger i här.
På grund av hur nod faktiskt optimerar
för JavaScript-runtime att vara så snabb på servern,
ibland noden debugger har en del fel när du försöker
och ange brytpunkter dynamiskt och du faktiskt behöver
att använda en debugger och inte den rad för rad.
Så låt oss se om detta får oss vad vi vill ha.
Så jag satt, app.get json kurs id,
och jag har satt min debugger där
i catch-sats vid bottnen.
Fetch kräver sant, det ska - okej, där vi går, bröt.
Så, nu kan jag se att det stoppade
vid denna sista catch-blocket eftersom withRelated -
eller därför att kräva sann specificerade och det finns ingen kurs
med ID för denna stora antal genom ett undantag
som nu är Emessage.
Och varje fel i JavaScript har en stapel egendom
som kommer tillsammans med den.
Så det är ofta bra för att till exempel,
trösta logga ut e.stack.
Och jag kan faktiskt se när jag slog fel.
Så jag får fel tom svar, det är budskapet
som skickades via Bookshelf.
Men nu kan jag ta en titt på, på anropsstacken och se
att i bokhylla dialekter SQL modell 83,
denna tomma svar fel kastades.
Och det är där jag nämnts, det är prick anonym
eftersom det är en anonym funktion.
Om det var ett namn funktion du skulle ha bättre idéer
vilken fungerar faktiskt igenom utan att behöva gå
in i model.js kod.
Även om det är tänkt att vara ganska, ganska läsbar,
så jag kan se det på nätet.
Vad har de att säga mig var linje 83.
Så, om options.require och svaret fanns inte,
nu kastar ett nytt tom felmeddelande.
Så du kan se ganska okomplicerad hur det fungerar.
Och internt i bokhylla,
det är bara en helt gäng användning av löften.
Så du kan ange Promise.method
med Bluebird biblioteket som håller rätt sammanhang
i denna stund återvänder ett löfte.
Och så har jag - jag är bindande värdet av denna liknande
vad jag hade nämnt tidigare, men med användning av löften
och då kan jag - är ny.
Det kan vara asynkron eller inte om jag vill.
Och så gör jag lite annat som kan
eller inte kan vara asynkron och då sorters hopp ner här.
Så Promise.all är en hjälpare som mycket populära bibliotek har
där du kan ha en samling av potentiellt kan
eller kanske inte löften.
Och när alla dessa är klar, återvänder du att
och sedan hoppar till nästa rad
och du kan se hur det egentligen planar ut pyramiden
att du får den återuppringning helvetet som det heter
om du gör allting med callbacks rad för rad.
Det finns sätt att komma runt det men löften är en
av de bästa sätten i min mening
att verkligen hålla kod ren och lätt att läsa.
Så det är bara en kort Introduktion till JavaScript
och att bokhyllan och Knex i allmänhet.
Och, om det finns några frågor, Jag vet att det finns massor av material
att sorts försöka lock särskilt eftersom språken,
skillnad från de flesta att du är bekant med så jag ville bara
för att göra det så att åtminstone Om du har problem
med din kod, du kan sorts hoppa in -
det är vad jag vill göra, är sorts hoppa in biblioteken
som jag använder och ser hur saker är uppbyggda.
Det finns en som jag hade nämnt tidigare kallad Backbone.js
och det är faktiskt [Ohörbart] på klientsidan
att bidra till att ge modellvyn controller struktur
till din kod.
Men det har faktiskt kommenterad dokumentation källa
vilket gör att du kan slags se.
Det är riktigt bra dokumenteras, vad som händer,
hur det utöka Ajax funktionalitet
eller händelse funktionalitet eller de modeller och samlingar sorterar
att förklara vad som är händer i processen.
Och om du förstår grunderna i JavaScript
liksom prototypal arv och hur funktioner används
som både objekt och värden och klasser och allt.
Det gör det mycket enklare att förstå vad som händer
om eventuellt i bibliotek som du använder
och debugger kod och kunna att inte banka huvudet
mot väggen på grund du förstår inte hur
olika delar arbetar så.