SQL och Node
Installera mysql paketet för node med npm.
Installera paketen mysql och dotenv för Node.
npm install mysqlmysql 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.
npm install mysql dotenvKoppla 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.
const mysql = require('mysql');
const connection = mysql.createConnection({
host : 'example.org',
user : 'bob',
password : 'secret'
});
connection.connect(function (err) {
if (err) {
console.error('error connecting: ' + err.stack);
return;
}
console.log('connected as id ' + connection.threadId);
});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-exampleutan konfigurationsvärden.Kopiera sedan filen till en ny fil med namnet
.envoch 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.
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.
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).
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.
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.
Ă–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.
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?