Uppgift Blog
Node.js/Express/MongoDB
Introduktion
Vårt mål
En blog där man kan registrera sig som användare, logga in, skapa inlägg och läsa inlägg, uppdatera och ta bort inlägg
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.
Använda Visual Code
Installera Node.js
Uppgift Blog - Del 1
Använda Express och sätta upp routes enligt REST API
Vad är ramverket Express?
Vad är ett ramverk?
eng. framework
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.


Vad är Express?
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.
Skapa en enkel HTTP-server med Express
Let's code!

Använda NPM
Node Package Manager

Med routing anger vi att vissa sökvägar för vår webbapplikation ska trigga igång specifika koddelar.
Vad är routing?
- http://exampleblog.com/posts efterfrågas,så ska användaren kunna se alla inlägg
- http:/exampleblog.com/posts/new efterfrågas,så ska användaren kunna skapa ett nytt inlägg

Exempelvis en viss route i vår webbapplikation ska ansvara för att när:
Vad är ett REST API?
Scenario: Vi vill sätta upp routes för en webbapplikation som ska vara en blog.
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
REST API
en mappning, regler hur ett API ska sättas upp
/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 |
7 REST API routes
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
Testa våra routes med Postman
Uppgift Blog - Del 2
Refaktorisera
Miljövariabler
Använda databasen MongoDB
Refaktorisering och moduler i Node.js

Varför moduler?
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).
Refaktorisera våra routes
Refaktorisera våra funktioner för databashantering
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 |
7 REST API routes
För att hantera inlägg på en blog (posts)
CRUD, CREATE READ UPDATE DELETE
Databasen MongoDB

Vad är en databas?
- En organiserad samling av data (data = information) på ett sådant sätt att det är lätt att söka efter och hämta enskilda bitar information, samt även ändra informationen.
- Är persistent, d.v.s försvinner inte när man avslutar programmet eller stänger av datorn.
- Om man vill skapa en databas vill man gör en modell som beskriver verkligheten. Till exempel göra en beskrivning hur en webbutik ser ut och fungerar (produkter, priser, kunder, lagerstatus...). Eller i vårt fall en blog (användare, inlägg, kommenterar, bilder..).
Olika databaser
- Det finns flera olika databaser. En vanlig uppdelning är mellan relationsdatabaser (SQL) och icke-relationsdatabaser (NoSQL).
- En relationsdatabas som SQL eller mySQL är uppbyggt av tabeller
- En icke-relationsdatabas som MongoDB är uppbyggt av dokument.
- I stacken Node.js + Express är MongoDB vanligast och den databas vi ska använda mest i kursen.
- Vi kommer även studera en mySQL-databas översiktligt senare i kursen.
Introduktion till MongoDB
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"



Molntjänsten MongoDB Atlas
Miljövariabler och modulen dotenv i Node.js
Mongoose
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
Databasuppkoppling till MongoDB Atlas
Skapa en modell för våra inlägg i Mongoose
Skapa en modell för våra inlägg (posts)
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.
Uppgift Blog - Del 3
Skapa databasfunktioner enligt CRUD
Använda templatemotorn EJS för att rendera dynamisk HTML.
Använda Nodemon
Skapa databashantering enligt CRUD med Mongoose
Att skicka data med POST
request.body
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
Att hämta url-parameter
request.params
Mongoosefunktioner för datapersistens
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!

Använda Templates
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.
Templatemotor
Det finns även andra templatemotorer som Pug (https://pugjs.org/) och Handlebars (https://handlebarsjs.com/)
Använda Partials
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!
Partials
så kallas denna teknik
Skapa våra views
<h1>Dagens datum</h1>
<p>Datum och tid för idag: <%= date %></p>
Skapa en vy-fil
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);
});
En route som som renderar en view
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
Redirect
Att skickas till annan url
Använda statiska resurser i Express
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.
EJS syntax
<%# Kommentarer! %>
<p>Datum och tid för idag: <%= date %></p>
Variabler
Kommentarer
EJS syntax
<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
Material till videoföreläsning
By Sandra Larsson
Material till videoföreläsning
- 146