SQL och Node
Installera mysql paketet för node med npm.
Installera paketen mysql och dotenv för Node.
mysql paketet innehÄller drivrutiner för att anvÀnda mysql med node.
dotenv Àr ett paket för att skapa konfiguarationsfiler. Att spara konfigurationsdata separerat frÄn koden Àr god praxis.
En databas behöver anvÀndaruppgifter för att koppla upp sig till en databasserver. Denna data Àr kÀnslig och du behöver skydda den, dÀrför Àr det viktigt att inte ladda upp denna data pÄ GitHub. För att underlÀtta det anvÀnds paketet dotenv. Med dotenv kan vi skapa en konfigurationsfil och med hjÀlpa av .gitignore sÄ sÀkerstÀller vi att den inte laddas upp pÄ GitHub.
Koppla upp
Detta exempel Àr plockat frÄn mysql-paketets hjÀlpsida, den Äterfinns Àven i Express-dokumentation. Ofta ser Node-hjÀlp ut pÄ detta sÀttet och det kan vara svÄrt att fÄ svar pÄ var detta ska skrivas(vi kommer till det). Du behöver inte koda detta, men om du gör det sÄ kan du lÀgga koden i en route.
Först skapas en const för mysql-paketet, drivrutinen krÀvs. Efter det sÄ skapas en uppkoppling till mysql-servern utifrÄn den angivna konfigurationen. DÀrefter testats uppkopplingen med connect metoden och vid eventuellt fel sÄ loggas det, annars sÄ loggas uppkopplingen. Koden kan testas i app.js eller i en route fil för express om sÄ önskas.
Node kan fÄ problem med auth till MySql 8. DÄ behöver du uppdatera din mysql-anvÀndare pÄ mysql servern. SQL frÄgan för detta finns hÀr nedanför.
Konfiguration
Det första som behöver ÄtgÀrdas Àr konfigurationsvÀrdena i exemplet och för det sÄ ska vi anvÀnda dotenv paketet. En dotenv fil Àr en konfigurationsfil(eller en fil med miljövariabler, environment). Filnamnet börjar med en punkt, vilket Àr en Linux standard för att visa att det rör sig om en dold fil(vilket ofta konfigurationsfiler Àr).
Att arbeta med konfigurationen för ett projekt i en separat fil Àr en god praxis som lÄter dig konfigurera upp ett projekt utan att Àndra i koden. Att separera konfigurationen skyddar kÀnslig konfigurationsdata(lösenord, anvÀndare api-nycklar) frÄn att laddas upp pÄ till exempel GitHub. dotenv filen skapas i projektets root.
Skapa först en fil med namnet
.env-example
utan konfigurationsvÀrden.Kopiera sedan filen till en ny fil med namnet
.env
och fyll i konfigurationsvÀrdena.
För en databaskonfiguration behövs, host, username, password och databas.
Skapa sedan en .gitignore fil i projektets root för att kontrollera sÄ att dotenv filen inte laddas upp pÄ GitHub.
Utan .gitignore kvittar det att du skapar .env filerna.
För att komma Ät vÀrdena frÄn dotenv filen sÄ behöver paketet laddas in sÄ tidigt som möjligt i applikationen. VÀrdena Äterfinns sedan i objektet process.env
.
Kom ihÄg att starta om din server efter du Àndrat i dotenv filen, sÄ att Àndringarna laddas.
Med dotenv paketet laddat kan det ovanstÄende exemplet Àndras till.
Databasmodell
För att anvÀnda mysql kommer vi att skapa en ÄteranvÀndbar modell. Denna modell kommer Àven att anvÀnda en pool med uppkopplingar. Modellen kommer att exportera en skapad pool för anvÀndning.
Skapa en ny mapp models i projektets root och i models en fil med namn, db.js.
Skapa sedan en ny route fil för att testa modellen, routes/dbtest.js.
App.js behöver uppdateras för att ladda routen, gör följande Àndring dÀr de andra routerna laddas och anvÀnds.
Databasmodellen sparas i variabeln pool för anvÀndning. Sedan anvÀnds metoden .getConnection()
för att hÀmta en uppkoppling frÄn poolen. Sidan visar sedan uppkopplingens id innan uppkopplingen slÀpps, release. Testa vad som sker utan connection.release()
.
DatabasfrÄga
För att testa att kommunicera med en databas behöver du starta en mysql-server och importera databasen frÄn föregÄende kapitels exempel.
Databasdump finns hÀr. AnvÀnd wget för att hÀmta den.
Du kan ocksÄ anvÀnda Tableplus för att importera databaser.
NÀr du laddat ned filen sÄ förbered för att importera den med att skapa en databas(om det behövs).
Ăndra sedan test-routen till att innehĂ„lla en faktisk SQL frĂ„ga. Routen kommer nu att svara pĂ„ /test och svara med resultatet av databasfrĂ„gan i JSON. Du kan Ă€ven logga(console.log eller console.table) resulatet frĂ„n databasfrĂ„gan för att se hur objektet ser ut(det skrivs dĂ„ i terminalen dĂ€r du startat node).
LÀr dig anvÀnda console funktionera för att felsöka din kod. Det finns ett antal olika console funktioner du kan anvÀnda.
Databasresultat till en view
I det hÀr steget ska vi skapa en view som kan visa resultatet av en SQL frÄga. Detta för att sammankoppla alla delarna. För att göra detta sÄ behöver routen Àndras. Test-routens respons ska anvÀnda render metoden med en test-view och resultatets data.
Skapa sedan en view som heter test. I en första test skriver vi ut vÀrdena frÄn mysql resultatet med interpolation i Pug. Det Àr dÄ viktigt att se till att vÀrden som skrivs ut escapas, detta för att skadlig kod eventuellt kan sparas i en databas och sedan reproduceras för en anvÀndare pÄ webbplatsen.
AnvÀnd console.log()
i routen för att felsöka och undersöka data. Detta dumpar datan till den terminal dÀr du startat upp node.
Resultatet mÄste itereras, eftersom det Àr en array. För att göra det anvÀnds Pugs each funktion.
För att fÄ ut den fullstÀndiga information, med författarens namn sÄ behöver SQL frÄgan anvÀnda en join pÄ users tabellen. Uppdatera koden som följer.
NÀsta steg blir sedan att utveckla test-viewen. Detta kan med fördel göras som en mixin. Koden som följer skapar ett kort för en post.
Ăvning
Skapa en mixin som du kan kalla pÄ för varje rad i databasen, antingen skriver du kod för ett eget kort med css eller sÄ anvÀnder du ett Bootstrap kort.
Databas selektion
I SQL sÄ kan WHERE anvÀndas för att vÀlja rader utifrÄn ett logiskt uttryck. För att vÀlja en specifik meeps sÄ anvÀnds ID kolumnen. Det ser ut som följer med resultat.
Du kan sjÀlvklart vÀlja data utifrÄn andra fÀlt som user_id för att vÀlja alla poster frÄn en specifik anvÀndare. För wildcard sÄ anvÀnds %.
Ăvning
Prova att skriva en SQL frÄga som lÄter dig söka efter mailadresser i databasen. TÀnka att anvÀndaren ska kunna söka efter ett förnamn och fÄ tillbaka matchande adresser. AnvÀnd SQL wildcards, %.
Selektion och node
För att kunna vÀlja rader frÄn databasen med specifika ID, sÄ mÄste servern kunna ta emot ID parametern. För att skicka en parameter behöver en route skapas eller Àndras för att tillÄta detta. DÄ anvÀnds :PARAMETERNAMN
i routen.
Denna route pÄ / lÀser in en parameter med namnet :id
. VÀrdet pÄ parametrarna Äterfinns i requestens(req) parameter-objekt. Du kommer Ät detta genom punkt-notation.
VÀrdet som skickats med en parameter kan sedan anvÀndas i SQL frÄgan, det görs genom en sÄ kallad prepared statment. Prepared statements(Àven parameterized query) anvÀnds av sÀkerhetsskÀl för att undvika SQL-injektioner.
Ăndringen i test-routen skapar en route för get som tillĂ„ter en id parameter. Rad 2 skapar SQL-frĂ„gan dĂ€r frĂ„getecknet Ă€r en parameter. FrĂ„gan körs sedan pĂ„ rad 4, dĂ„ ersĂ€tts ? med [req.params.id]. Det gĂ„r utmĂ€rkt att anvĂ€nda flera parameterar(tĂ€nk post med ett formulĂ€r). Med flera parametrar Ă€r det viktigt att de Ă€r satta i rĂ€tt ordning.
Om frÄgan exekveras korrekt sÄ returneras svaret som json till webblÀsaren.
Ăvning
Skapa lÀnkar till enskilda meeps.
test.pug, ge varje meep en lÀnk till /test/:id
skapa /test/:id routen
skapa SQL som hÀmtar vald meep utifrÄn :id (inklusive join)
skapa en meep.pug views som visar vald meep(ersÀtt json i exemplet ovan)
Databasmodell, asynkrona frÄgor
Ibland sÄ uppstÄr problem med databasuppkopplingen eller sÄ behövs det flera uppkopplingar. Vid dessa tillfÀllen sÄ kan du behöva större kontroll över vad som sker och hur data levereras till klienten. En lösning pÄ detta Àr att göra asynkrona anrop, dÄ kan du styra över att din kod ska invÀnta svar frÄn databasen.
För att möjliggöra asynkrona anrop Àndras databasmodellen till följande.
Query funktionen accepterar en SQL frÄga samt tillhörande parametrar.
Flera frÄgor
Nu kan query
funktionen anvÀndas i en route genom att requira den. Med query funktionen kan routen göras asynkron med nyckelordet async
.
Async tillÄter anvÀndningen av await vilket tillÄter koden att invÀnta svar. Det görs genom nÄgot som kallas för promises. En promise resulterar i att den antingen resolves eller rejects, körs eller misslyckas. MDN async function.
I koden nedan sÄ Àndras users routen för att tillÄta anvÀndaren att köra den med en parameter :id
, anvÀndarens id. För att illustrera dubbla SQL-frÄgor sÄ hÀmtas dÄ Àven den anvÀndarens alla tillhörande meeps. Utan att anvÀnda async
och await
sÄ vÀntar aldrig scriptet pÄ att dessa frÄgor ska köras, utan returnerar ingen data. JÀmför koden hÀr nedan och prova bÄda versionerna.
Koden vÀntar pÄ att promises för bÄda SQL-frÄgorna ska bli "klar". NÀr den Àr klar sÄ renderas users-view med databas-frÄgornas data. FrÄgorna körs i ett try
block för att fÄnga eventuella fel med catch
. Om ett fel uppstÄr sÄ fÄngas det upp och vi anvÀnder Express inbyggda felhanterare, next(error)
.
I anvÀndar-vyn sÄ anvÀnds selektion i Pug-koden för att det inte ska visas fel nÀr data saknas(testa att köra utan if-satserna).
Last updated
Was this helpful?