Ólafur Sverrir Kjartansson, osk@hi.is
- Gætum vel skrifað okkar eigin bakenda frá grunni
- Aðeins notað einingar í node
- Engin. Dependency. 😤
- Værum að finna upp hjólið og eyða tíma
- Web app framework fyrir node
- Smátt í sniðum en gefur mikla möguleika á að bæta við virkni til að gera hérumbil hvað sem er
npm install express --save
const express = require('express');
const app = express();
const hostname = '127.0.0.1';
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
- Búum til Express forrit með því að kalla í
express()
- Sér m.a. um:
- routing fyrir HTTP beiðnir
- Middleware uppsetningar
- Stillingar á birtingu (með HTML)
app.locals
er hlutur sem geymir gögn fyrir app- Aðgengileg á meðan app keyrir
- Aðgengilegt frá
request
meðreq.app.locals
- Getum stillt
app
meðget()
ogset()
, t.d.env
, segir til um hvort app keyri íproduction
eðadevelopment
view engine
, hvaða template vél við notumviews
, í hvaða möppu eru template- o.fl.
app
hefur föll sem passa við HTTP aðgerðirget()
,post()
,put()
,delete()
og fleiriall()
á við allar aðgerðir
- Getum unnið með mörg app í einu með
use
- Hópað saman virkni
use
er líka notað til að skilgreina middleware
const express = require('express');
const app = express();
const subapp = express();
app.get('/', (req, res) => {
res.send('hello world');
});
subapp.get('/', (req, res) => {
res.send('hello from subapp');
});
app.use('/sub', subapp);
req
stendur fyrir HTTP request sem kemur frá client- Getum skýrt annað (t.d.
request
eðafoo
) með því að skýra argument annað
- Getum skýrt annað (t.d.
- Hefur bæði eigindi og föll
req.url
, erft fráhttp
og gæti hafa verið átt viðreq.originalUrl
,url
án allra afskiptareq.ip
, IP tala þess sem gerði beiðnireq.query
, hlutur með öllum querystring breytum- o.fl.
req.accepts(types)
, athugar hvort client tekur við ákveðnu MIME type- MIME type segir til um á hvaða formi gögn eru, t.d.
application/json
- MIME type segir til um á hvaða formi gögn eru, t.d.
req.get(header)
, skilar request header, ekki hástafanæmt
res
stendur fyrir HTTP response sem við erum að skila til client- Hefur bæði eigindi og föll
res.headersSent
, bool sem segir okkur hvort headers hafi verið sendir client eða ekkires.locals
, hlutur sem inniheldur gögn sem verða aðgengileg fyrir view/template, getum bætt við upplýsingum frá request
res.write(content)
, erft fráhttp
, skrifar í response straumres.end()
, erft fráhttp
, endar response straum og sendir á clientres.send(content)
, skrifar í response straum, t.d. seturContent-Length
header og endar hannres.status(statusCode)
, setur HTTP status á response
res.set(field, value)
, setur response headersres.json(data)
, einsogsend()
nema sendir JSON gögnres.redirect(location)
, framkvæmir redirect álocation
- o.fl.
- Höfum séð leiðir til þess að útbúa slóðir sem keyra ákveðin kóða
- Ekki sérstaklega handhægt að gera í höndunum
- Framework geta hjálpað okkur við að útbúa góðar og skýrar slóðir
- „Friendly URL“ eru slóðir sem auðvelt er að lesa úr og nota, bæði af fólki og vélum
/programming/web
ekki/?cat=programming&sub=web
- Einnig stuðningur við gagnaflutning, t.d. senda streng gegnum URL
/article/foo-bar
skilar okkur færslu með eigindifoo-bar
- Express hefur stuðning við routing
- Route eru slóð (URI) sem forritið okkar svarar beiðnum frá client á
- Samanstendur af URI, HTTP aðferð og einum eða fleirum föllum
app.METHOD(URI, callback)
- Margar HTTP aðferðir til, en við notum að mestu
get
ogpost
all
er hægt að nota til að svara fyrir allar aðferðir
- URI getur notað regular expressions en ættum að forðast nema þurfum virkilega
app.get(/foo.*$/, callback)
svarar fyrir allt sem byrjar á/foo
- Query string er ekki partur af route path, nálgumst með
req.query
- Callback sem skilgreint er fyrir route vísar í middleware
- Geta verið mörg í röð
app.get('/', cb1, cb2)
- Í fylki
app.get('/', [cb1, cb2])
- Eða blanda
- Ef við skilgreinum route með parameter getum við nálgast þau gögn í
req
app.get('/users/:userId', cb)
req.params.userId
- Getum búið til route án þess að hafa
app
með því að notaconst router = express.Router()
- Exportum síðan
router
- Exportum síðan
- Skiptum forriti upp í einingar þar sem hver sér um ákveðin hluta af routes
- Hefur aðgang að request og response hlutum og næsta middleware
function middleware(req, res, next)
- Getur
- Keyrt kóða
- Breytt
req
eðares
- Endað request-response keyrslu
- Kallað í næsta middleware
- Middleware eru keyrð í FIFO röð
- Verðum að keyra
next()
á einhverjum tímapunkti til þess að næsta middleware geti tekið við- Fyrir route sem skilar upplýsingum viljum við samt oftast ekki kalla í
next()
heldurreq.send()
til að enda reponse
- Fyrir route sem skilar upplýsingum viljum við samt oftast ekki kalla í
- Getum skilgreint fyrir
- Allt forrit
- Per route
- Villumeðhöndlun
function helloWorld(req, res, next) {
console.log('Hello world!');
next();
}
app.use(helloWorld);
function userHandler (req, res, next) {
// ...
next();
}
router.get('/user/:id', helloWorld, userHandler);
- Við skilgreinum villumeðhöndlunar middleware með auka argument
function (err, req, res, next)
- Skilgreind seinast í app, á eftir öllum öðrum middleware
- Sér um að taka til, logga villu, senda notanda villuskilaboð o.sfr.
- Getum nýtt okkur middleware til þess að grípa 404 villur
- Verið að reyna að opna route sem við höfum ekki skilgreint
- Setjum middleware á eftir öllum routes sem við vitum að muni aðeins keyra ef ekkert hefur sent reponse
- En samt á undan villumeðhöndlun
app.use(function notfound(req, res, next) {
res.status(404).send('404 Not Found');
});
app.use(function error(err, req, res, next) {
console.error(err);
res.status(500).send('Error occured');
});
- Express hefur innbyggt middleware til að birta statískar skrár
- t.d. CSS, myndir
app.use(express.static(path.join(__dirname, 'public')))
- Serving static files in Express
- Til að birta síðu þurfum við að hafa útlit fyrir hana – eitthvað ákveðið HTML
- Ekki skilvirkt að útbúa sjálf HTML með því að setja saman strengi
- Template leyfa okkur að útbúa útlit óháð virkni, við fáum gögn og við birtum þau á ákveðinn hátt
- Mörg template mál til, t.d.
- Pug, EJS, Handlebars, Mustache
- Sækjum útfærslu á template máli fyrir Express
- Skilgreinum á
app
hvaða template mál við notum og hvar template eru geymdapp.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
res.render(template, data)
notar skilgreindar template vél til að birtatemplate
meðdata
Skrifum HTML en með EJS syntax til að nálgast gögn og setja saman síður
<% %>
fyrir flæðistýringar<%= %>
til að birta gögn<%- %>
til að birta gögn unescaped- Birtir hrátt HTML í gögnum, hættulegt!
<% include header %>
bætir template úrheader.ejs
inn á viðeigandi stað- Öll gögn skilgreind með
app.locals
eru aðgengileg í template - Nánari skjölun á EJS
- Tól sem býr til grunn fyrir okkur til að vinna útfrá
npm install -g express-generator
express <heiti-á-verkefni>
- Er hálfpartinn úrelt, mæli ekki með notkun