Webtechnologien Wintersemester 2024

 

Node.js

  • Server-side JavaScript Runtime
  • Event-driven, non-blocking I/O
  • V8 Engine
  • Anwendung: prinzipiell alles, aber häufig
    • CLI-Programme
    • Web-Server
    • Desktop Apps über Electron
  • JS-Laufzeitumgebung basierend auf Chrome V8
  • Node.js Architektur: Event Loop, Single-threaded,
  • kann alles, was andere sprachen auch können: dynamische inalte erzeugen, dateien lesen, formular-daten entgegen nehmen, inhalte in datenbank speichern

Installation

Debugging

  • REPL: node
  • console.log im Code
  • ndb + debugger;
  • (VSCode und IntelliJ haben integrierte Debugger)
  • global object
  • live expressions

Module & NPM

  • JS hatte lange keine eigenen Sprachkonstrukte für Module, darum globale Funktion require
  • mit ES6 kam import dazu, ist aber noch nicht vollständig verbreitet (nur in .mjs)
  • Node.js hat nur wenige integrierte Module, z.B. fs, http, os, path, url
  • für alles andere: reichhaltiges Ökosystem über npm
  • Deklaration in package.json
  • neues Projekt mit npm init starten
  • Pakete mit npm install Paketname installieren
  • Java: import java.util.*;
  • Node-Philosophie: small core, small modules
  • hat Vor- und Nachteile (schnelle Innovation aber keine klaren Wege)
  • global verfügbares Objekt module mit property exports

Beispiel Core Modules + asynchrone Programmierung

const fs = require('fs');

// sync / blocking
const content = fs.readFileSync(filename, 'utf8');

// async / non-blocking
fs.readFile(filename, 'utf8', (err, content) => {
  if (err) console.error(err);
  console.log(content);
});

fs.writeFile('hello.txt', 'Hello world!', (err) => {
  if (err) console.error(err);
});
  • Callbacks
  • Promises
  • Async/await

Anwendung - Web-Server

node --watch server.mjs


import { createServer } from 'node:http';

const server = createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(3000, '127.0.0.1', () => {
  console.log('Server started');
});
  • Dateiendung: mjs, damit wir Imports nutzen können
  • Client-Server-Modell erklären
  • Aufgabe eines Web-Servers: TCP-Verbindung entgegen nehmen, auf HTTP-Anfrage mit HTTP-Antwort reagieren
  • Beispiel umbauen
    • auf text/html setzen
    • debugger setzen und req untersuchen
    • eigenen Pfad einbauen
  • und weil das alles schnell viel wird, haben Leute Frameworks entwickelt, die das abstrahieren, das populärste davon ist Express