title |
---|
Node atburðir & straumar |
Ólafur Sverrir Kjartansson, [email protected]
- Kíkjum aðeins undir húddið
- Skoðum hvernig „low level“ meðhöndlun á þessu sem við höfum verið að gera fer fram
- Margt í Node.js er byggt á atburðum
- Eitthvað gerist og við bregðumst við því
- Allir hlutir í Node.js sem gefa frá sér atburði eru EventEmitters
- Skráum okkar meðhöndlun á atburði með
on()
falli- Svipar til
addEventListener
í vafra
- Svipar til
import EventEmitter from 'events';
const emitter = new EventEmitter();
emitter.on('some-event', () => {
console.log('omg event!');
});
- Getum útbúið okkar eigin EventEmitter með því að extenda
EventEmitter
- Erum samt mun oftar að nota event emittera frá öðrum en að skrifa okkar eigin
class Pulse extends EventEmitter {
pulse() {
this.emit('pulse');
}
start(n) {
this.id = setInterval(
() => this.pulse(),
n,
);
}
stop() {
clearInterval(this.id);
}
}
- Straumar (streams) eru abstract interface sem við notum til að eiga við streymandi gögn í Node.js
- Margir mismunandi straumer í boði, við lestur og skrif á skrám, HTTP server,
process.stdout
o.fl. - Straumar geta verið lesanlegir, skrifanlegir eða bæði (duplex)
- Straumar veita okkur aðgang að gögnum hraðar en að þurfa að bíða eftir öllu
- Lesum ekki alla skránna í minni áður en við getum byrjað að vinna með hana
- Strauma útfærslur nota buffers
- Sækjum ákveðið mikið í einu, vinnum með það, sækjum næsta part o.s.fr.
- Skiptir ekki máli fyrir minni skrár sem við lesum af disk
- En ef við reynum að lesa inn skrá sem er fleiri GB lendum við í vandræðum
- Fáum betri upplifun þegar við lesum skrár yfir net
- Ef við erum að horfa á vídeó værum við ekki kát að þurfa að bíða eftir að það væri allt sótt
- Ef straumur er skrifanlegur höfum við aðferðir til að skrifa í strauminn
- Skrifum í buffer sem síðan er streymt í strauminn
- Getum notað til að skrifa í skjöl, nettengingar o.fl.
- Getum pípað saman strauma til að lesa úr einum beint í annan
stream.pipe(another);
import fs from 'fs';
const stream = fs.createWriteStream('huge.txt');
for (let i = 0; i < 6e6; i++) {
stream.write('halló heimur ');
}
import fs from 'fs';
const read = fs.createReadStream('huge.txt');
read.on('data', (chunk) => {
console.log('chunk', chunk);
});
read.on('close', () => {
console.log('file read');
});
- Við getum notað
net
kjarnaeininguna til þess að útbúa TCP strauma - Of low-level fyrir okkur en gott að vita af
import net from 'net';
const server = net.createServer();
server.on('connection', () => {
/* ... */
});
- Nær okkur er
http
einingin sem leyfir okkur að búa til HTTP þjón - Yfirgripsmikill stuðningur við HTTP og styður strauma í samskiptum
- Anatomy of an HTTP Transaction
import http from 'http';
const server = http.createServer();
server.on('request', (req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
const port = 3000;
server.listen(port, () => {
console.log(`http://localhost:${port}/`);
});
request
(oftreq
) er lesanlegur straumur sem gefur okkur aðgang að upplýsingum um HTTP request frá client- t.d.
method
,url
ogheaders
- t.d.
- Gögn sem eru send, t.d. ef við erum að nota
POST
, þurfum við að lesa úr straumrequest.on('data', (chunk) => { /* ... */ });
response
(oftres
) er skrifanlegur straumur sem sendur verður client, getum átt við upplýsingarresponse.statusCode = 404;
response.setHeader('Foo', 'Bar');
response.write('<html lang="is">');
- Verðum alltaf að eiga við status kóða og headers áður en við skrifum í svarið!
- Getum notað
request.method
ogrequest.url
til að útfæra einfaldan vefþjón- Lesum CSS og HTML skrár af disk ef við eigum
- Svörum ákveðnum slóðum með dýnamísku efni
- Annars
404
- daemi/events-streams/simple-server/server.js
- Express nýtir http eininguna, veitir okkur aðgang að sömu föllum, propertieum
- Bætir við aukaleg því sem þarf til að notkun verði þægilegri