Skip to content

Latest commit

 

History

History
223 lines (153 loc) · 5.37 KB

events-streams.md

File metadata and controls

223 lines (153 loc) · 5.37 KB
title
Node atburðir & straumar

Node atburðir & straumar

Vefforritun

Ólafur Sverrir Kjartansson, [email protected]


Atburðir & straumar

  • 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

EventEmitters

  • 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

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);
  }
}

Dæmi


Straumar

  • 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');
});

Strauma dæmi


TCP

  • 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', () => {
  /* ... */
});

HTTP

  • 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

  • request (oft req) er lesanlegur straumur sem gefur okkur aðgang að upplýsingum um HTTP request frá client
    • t.d. method, url og headers
  • Gögn sem eru send, t.d. ef við erum að nota POST, þurfum við að lesa úr straum
    • request.on('data', (chunk) => { /* ... */ });

response

  • response (oft res) er skrifanlegur straumur sem sendur verður client, getum átt við upplýsingar
    • response.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ð!

Okkar eigin vefþjónn

  • Getum notað request.method og request.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

http og Express

  • 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

HTTP dæmi