Introduktion
Del 1
Använda Express och skapa routes enligt ett REST API.
Del 2
Refaktorisera.
Miljövariabler
Använda databasen MongoDB.
Del 3
Skapa databasfunktioner enligt CRUD.
Använda templetemotorn EJS för att rendera dynamisk HTML.
Del 4
Hantera användare för registrering och loginfunktionalitet.
Säkerhet.
Enkelt uttryckt är det en kombination av färdigskriven kod och regler för struktur för program. Det bygger på det befintliga programspråket och syftet med ett ramverk är att det ska gå snabbare att utveckla och underhålla kod för applikationer.
Express är ett ramverk för att skapa webbapplikationer på server-sidan (backend) på plattformen Node.js.
Det vi kommer använda från ramverket Express är att skapa en http-server, hantering hur olika routes sätts upp för att svara mot en speciell request metod såsom GET, POST, PUT, DELETE, för att skapa ett enkelt API. Vi ska även använda något som kallas för middleware.
Let's code!
Node Package Manager
Med routing anger vi att vissa sökvägar för vår webbapplikation ska trigga igång specifika koddelar.
Exempelvis en viss route i vår webbapplikation ska ansvara för att när:
Users
Posts
Images
Comments
Likes
e.t.c...
Olika resurser på en blog
Posts
http://www.exampeblog.com/addNewPost
ENDPOINT
URL
/getPost
/updatePost
/deletePost
/getPostByUser
/deletePostByUser
INTE BRA 👎
👉 Endpoints ska endast innehålla resursnamn som posts, users, comments etc och använda HTTP-metoder för beteende
/getPost
/updatePost
/deletePost
/addNewPost
GET /posts/7
PUT /posts/7
DELETE /posts/7
POST /posts
id för ett inlägg
/getPostByUser
/deletePostByUser
GET /users/7/posts
DELETE /users/7/posts/9
CREATE
READ
UPDATE
DELETE
HTTP-metoder
Använda CRUD
Route namn | Endpoint | HTTP Metod | Beskrivning |
---|---|---|---|
Index | /posts | GET | Visar alla inlägg |
New | /posts/new | GET | Visa ett formulär för att skapa nytt inlägg |
Create | /posts | POST | Skapa ett nytt inlägg |
Show | /posts/:id | GET | Visar specifikt inlägg |
Edit | /posts/:id/edit | GET | Visa formulär för att uppdatera nytt inlägg |
Update | /posts/:id | PUT | Uppdatera specifikt inlägg |
Delete | /posts/:id | DELETE | Tar bort specifikt inlägg |
För att hantera inlägg på en blog (posts)
Let's code!
Hur en webbsida efterfrågas
KLIENT
SERVER
👩💻
KLIENT
KLIENT
HTTP REQUEST
HTTP RESPONSE
HTTP metod + route + HTTP version
HTTP request header
HTTP request body (endast om man skickar data med POST)
HTTP version + statuskod
HTTP response header
HTTP response body (webbsidan vi får tillbaka)
HTTP vanliga statuskoder:
200 – OK
201 - Created
400 – Bad request
404 - Page not found
När vi skapar mer och mer kod i en applikation bör vi dela in den i mindre logiska delar för att skapa en bättre överblick.
En modul kan innehålla och exponera en eller flera funktioner, objekt, variabler, eller en klass.
En modul kan exporteras från en js-fil och importeras till en annan js-fil.
När man vill förändra sin kod så att den följer en bättre struktur och mindre upprepning kallas det för att refaktorisera (eng. refactoring).
Route namn | Endpoint | HTTP Metod | Beskrivning |
---|---|---|---|
Index | /posts | GET READ | Visar alla inlägg |
New | /posts/new | GET | Visa ett formulär för att skapa nytt inlägg |
Create | /posts | POST CREATE | Skapa ett nytt inlägg |
Show | /posts/:id | GET READ | Visar specifikt inlägg |
Edit | /posts/:id/edit | GET READ | Visa formulär för att uppdatera nytt inlägg |
Update | /posts/:id | PUT UPDATE | Uppdatera specifikt inlägg |
Delete | /posts/:id | DELETE DELETE | Tar bort specifikt inlägg |
För att hantera inlägg på en blog (posts)
CRUD, CREATE READ UPDATE DELETE
Databas
COLLECTION
innehåller ett flertal "document"
NoSQL
DOCUMENT
innehåller "key-value pairs"
DATABAS innehåller en eller flera "collections" såsom users, posts, etc.
SQL
"Tabell"
"Rader"
Mongoose är ett bibliotek som sköter databashantering för MongoDB på Node.js
Det är Mongoose funktioner vi kommer använda för databasuppkoppling, skapa modell för våra inlägg, samt CRUD-funktionerna för databashantering
const postSchema = new mongoose.Schema({
title: String,
image: String,
body: String
});
const Post = mongoose.model("Post", postSchema);
Vi behöver skapa en modell av våra inlägg för att definiera vilka egenskaper ett inlägg ska ha. I detta fall definierar vi en titel, bild och innehåll i inlägget.
I mongoose definierar man först något som kallas för Schema som man sedan kopplar till sin modell.
Hur en webbsida efterfrågas
KLIENT
SERVER
👩💻
KLIENT
KLIENT
HTTP REQUEST
HTTP RESPONSE
HTTP metod + route + HTTP version
HTTP request header
HTTP request body (endast om man skickar data med POST)
HTTP version + statuskod
HTTP response header
HTTP response body (webbsidan vi får tillbaka)
HTTP vanliga statuskoder:
200 – OK
201 - Created
400 – Bad request
404 - Page not found
Databasoperation | Hantering av inlägg | Mongoosefunktion |
---|---|---|
Create | Skapa inlägg | Model.create(request.body) |
Read | Hämta alla inlägg | Model.find() |
Read | Hämta specifikt inlägg | Model.findById(request.params.id) |
Update | Uppdatera inlägg | Model.findByIdAndUpdate( request.params.id, request.body) |
Delete | Ta bort inlägg | Model.findByIdAndDelete(request.params.id) |
Edit | Visa formulär för att uppdatera inlägg | Model.findById(request.params.id) |
Let's code!
Som templatemotor ska vi använda JavaScript templating (EJS) vilken hjälper oss att rendera HTML-sidor med dynamisk information från JavaScript. D.v.s med en templatemotor kan vi generera delar av HTML-koden och skriva ut innehåll från variabler i JavaScript, så att sidornas innehåll blir dynamiskt.
Det finns även andra templatemotorer som Pug (https://pugjs.org/) och Handlebars (https://handlebarsjs.com/)
Dela upp vår layout i delar för att inte repetera kod. Inom backend är det vanligt att dela in i minst i delare header och footer och lägga i varsin fil för att sedan inkludera i andra filer. Stor fördel att om vi exempelvis behöver ändra något i header så gör vi det endast i en fil och inte flera!
så kallas denna teknik
<h1>Dagens datum</h1>
<p>Datum och tid för idag: <%= date %></p>
Eller kallas även template-fil
Måste finnas i mappen views/ och ha filändelsen .ejs
views/exempel.js
EXEMPEL
Innanför dessa krumelurer "spottar" vi ut det dynamiska värdet för variabeln "date"
Hur? =>
router.get("/", function (request, response) {
let todayDate = new Date();
response.render("exempel", {date: todayDate);
});
routes/exempelRoute.js
EXEMPEL
Filen som variabeln "date" ska renderas till. Express förstår att den ligger i "views" och är en .ejs-fil
Variabeln som ska "skickas" till filen
På en webbplats är det vanligt med statiska resursers såsom bilder, stylesheets och Javascript-filer som används till klientsidan. Det kan också vara fler html-sidor som ska vara statiska och inte dynamiska.
Statiska resurser brukar man lägga i en mapp public.
<%# Kommentarer! %>
<p>Datum och tid för idag: <%= date %></p>
Variabler
Kommentarer
<h1>Our Post Page!</h1>
<ul>
<% for(let i = 0; i < posts.length; i++) { %>
<li><%= posts[i].title %> - <%= posts[i].name %> </li>
</ul>
<% } %>
<h1>Hey <%= username.toUpperCase() %>, Welcome to Our site</h1>
<% if(username.toLowerCase() === "danny"){ %>
<p>Danny you are Beautiful!</p>
<% } else { %>
<p>You are not Danny, you are not Beautiful!</p>
<% } %>
If-satser
Loopar