Introduktion

Webbserverprogrammering med Node och Express

Vad Àr Node?

Node.js (Node) Àr en server. Beskrivningen pÄ nodejs.org krÀver dock sin förklaring.

As an asynchronous event-driven JavaScript runtime, Node.js is designed to build scalable network applications.

Node Àr byggt pÄ en javascriptmotor (Chromes V8) för att kunna anvÀnda Javascript pÄ en server. Node kan fungera som en en webbserver och fyller samma roll som webbservern Apache i LAMP.

Installation och förberedelse

Den hÀr guiden utgÄr frÄn materialet kring Windows Subsystem for Linux (WSL). Den Node version som kommer att anvÀndas Àr 14, vilket Àr Nodes Long Term Support (LTS) version. För att installera version 14 av Node gÄr det inte att köra apt install node direkt.

sudo apt update
sudo apt upgrade

sudo apt install curl dirmngr apt-transport-https lsb-release ca-certificates
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -

sudo apt install nodejs

Kontrollera sedan den installerade versionen av Node, bör vara 14.x.

node --version

Med node följer Node Package Manager (npm), bör vara 6.x.

npm --version

NÀsta steg Àr att installera Express och Express generator. Express Àr ett minimalistiskt ramverk för Node. Express underlÀttar skapandet av en webbserver med Node. Express kommer att installeras globalt pÄ systemet, nÄgot som krÀver sudo.

sudo npm install -g express express-generator

Kontrollera sedan att det fungerade med.

express --help

Ett första projekt

För att skapa grunden till ett webbprojekt sÄ anvÀnds Express generator.

Var alltid vÀldigt noga med att köra kommandon frÄn rÀtt mapp. Skapa inte Git-repon eller Express-projekt i c:\

Skapa en mapp för projektet, gÄ in i mappen och kör Express.

mkdir PROJEKTNAMN
cd PROJEKTNAMN
express --no-view --css sass --git

Express generator skapar med detta kommando grund-strukturen för en app. Express generator körs med parametrarna view, css och git.

  • View vĂ€ljer den motor (pĂ„ engelska template engine), templatmotor, som Express anvĂ€der. I det hĂ€r fallet vĂ€ljer vi att inte anvĂ€nda en motor för detta. DĂ„ genereras statiska filer som default. Men vi kommer att installera och anvĂ€nda Nunjucks för detta.

  • Css vĂ€ljer att Express ska anvĂ€nda sig av sass/scss för projektets stilar.

  • Git skapar en .gitignore fil i projektet för att undvika att filer som inte ska finnas pĂ„ Git hamnar dĂ€r(node_modules mappen bland annat).

Node-projekt krÀver i allmÀnhet ett antal NPM-paket för att fungera. Express Àr inget undantag och för att slutföra installationen behöver NPM ladda ned de paket som Express krÀver. Paketen för ett Node-projekt Àr alltid listade i filen package.json. Paketen för Express installationen Àr följande.

package.json
"dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "morgan": "~1.9.1",
    "node-sass-middleware": "0.11.0"
},

NPM installerar paket med följande kommando.

npm install

npm install skapar en fil som heter package-lock.json, filen innehÄller information om alla paketen som installerats och de paket som de krÀver för att fungera i sin tur. Om install-kommandot kördes utan fel (vid fel stÄr det npm ERR!) sÄ Àr servern redo.

npm start

Surfa sedan till localhost:3000. Node-servern Àr startad och kan besökas med vÀrddatorns ip-adress och rÀtt port Àven frÄn andra datorer.

Port 3000 anvÀnds ofta för att komma Ät en utvecklar Node-servern. Detta skiljer sig frÄn HTTP-standardporten som Àr 80.

Nodemon

Nodemon Àr ett paket till Node som underlÀttar utvecklingen av projekt. Det bevakar och lyssnar efter Àndringar i serverns filer. Om filerna sparas (Àndras) sÄ laddas Node om.

sudo npm install -g nodemon

Uppdatera package.json.

package.json
"scripts": {
  "dev": "nodemon ./bin/www"
},

Starta sedan servern igen.

npm run dev

Eslint

Visual Studio Code (vscode) kan anvÀndas tillsammans med en sÄ kallad linter för att hitta fel och formatera kod. Eslint Àr en linter för Javascript. Det Àr vÀldigt praktiskt vid arbete med kod och hjÀlper dig som utvecklare att följa praxis och skapa kod av hög kvalité. För att kunna köra Eslint kan det behöva installeras globalt, det gör vi med -g parametern.

sudo npm install -g eslint

För att slutföra installationen av Eslint sÄ behöver en konfigurationsfil skapas. Var noga med att vara i projektmappen nÀr du kör kommandot.

eslint --init

Svara följande:

? How would you like to use ESLint? To check syntax, find problems, and enforce code style
? What type of modules does your project use? CommonJS (require/exports)
? Which framework does your project use? None of these
? Does your project use TypeScript? No
? Where does your code run? Browser, Node
? How would you like to define a style for your project? Use a popular style guide
? Which style guide do you want to follow? Standard: https://github.com/standard/standard
? What format do you want your config file to be in? JavaScript

NPM kommer sedan att frÄga om paketen ska installeras, vÀlj ja.

I projektets root har Eslint skapat en fil som heter .eslintrc.js med instÀllningarna. Mer information kring Javascript standard style hittar du pÄ Standardjs.

Eslintrc kan nu redigeras för att Àndra instÀllningarna. För att till exempel Àndra formateringsregler sÄ finns de under rules. En sÄdan regel kan vara att visa fel nÀr semi-kolon saknas.

eslintrc.js
rules: {
  // "indent": ["error", 4],
  "semi": ["error", "always"] // fel om det saknas semikolon
}

Till sist sÄ behöver du installera eslint extension (svenska tillÀgg) i Vscode. Extensions finns i sidomenyn.

Sök efter eslint och installera följande tillÀgg.

LÀr kÀnna din app

Applikationens grunder Àr nu installerade tillsammans med ett par verktyg för att underlÀtta utvecklingen. NÀsta steg Àr att titta pÄ Express filstruktur och hur du arbetar med det. Filstrukturen i Express ser ut sÄhÀr efter installationen.

bin/
  www
node_modules/
public/
  images/
  javascript/
  stylesheets/
routes/
  index.js
  users.js
app.js
package.json

I roten finns app.js och package.json samt en del andra konfigurationsfiler. App.js Àr Node-serverns startpunkt. Detta föregÄs av att start-scriptet i package.json utgÄr frÄn filen www, i bin mappen, som i sin tur ladda app.js.

App.js laddar in serverns routes frÄn routes/ foldern. NÀr en route laddas efter ett anrop till servern sÄ viser de i sin tur HTML-templaten frÄn views/ mappen. Statiska filer finns i public/ mappen, sÄsom css och bilder.

Routes

En route Àr den vÀg en request tar i din applikation. AnvÀndaren efterfrÄgar en resurs och i routen sÄ bestÀmmer du vad som ska ske dÄ.

Routerna som skapas av Express generator Àr index och users. Index hanterar anrop till / och users till /users. Applikationens router laddas och kopplas till en adress i app.js.

app.js
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
// ... //
app.use('/', indexRouter);
app.use('/users', usersRouter);

Routerna innehÄller i sin tur koden för att hantera anropen. Detta system skapar struktur för koden. Koden för index-routen ser ut sÄhÀr, pÄ Git.

routes/index.js
/* GET home page. */
router.get('/', function (req, res, next) {
  // render view med data
  res.render('index', { data: 'Data jag vill skicka till sidan' });
});

En view laddas med ett sÄ kallat middleware i app.js. Det sÀtter en path till views-mappen och bestÀmmer vilken templatmotor som ska anvÀndas. Det finns ett stort antal middleware med olika funktioner och det Àr en viktig del av Express. Enkelt sagt sÄ Àr middleware insticksprogram som utökar Express funktion.

En egen route

För att skapa en route sÄ kan vi redigera filen index.js i routes mappen. Kopiera GET routen för / och klistra in den efter den existerande routen. Routen vi skapar Àr för en GET request till /test och den svarar med text.

routes/index.js
/* GET home page. */
router.get('/test', function (req, res, next) {
  // render view med data
  res.send('Detta Àr en ny testroute.');
});

En till route

Routen ovan finns i index.js filen och Àr kopplad till / och /test. Prova nu att skapa en test router. Kopiera routes/index.js och döp om den till test.js.

Routen behöver sedan kopplas i app.js filen för att den ska kunna anvÀndas.

app.js
const testRouter = require('./routes/test');
...
app.use('/test', testRouter);

Prova sedan att surfa till http://localhost:3000/test, visas din nya route? Annars sÄ behöver du felsöka detta. Har du kvar en /test route i index.js?

Last updated