Shell-Skripting mit Node.js
Sie können die Offline-Version dieses Buches (HTML, PDF, EPUB, MOBI) kaufen und damit die kostenlose Online-Version unterstützen.
(Werbung, bitte nicht blockieren.)

11 Stream-Rezepte



11.1 Schreiben in die Standardausgabe (stdout)

Es gibt drei Optionen zum Schreiben in stdout.

11.1.1 Schreiben in stdout über console.log()

console.log(format, ...args) schreibt in stdout und hängt immer einen Zeilenumbruch '\n' an (auch unter Windows). Das erste Argument kann Platzhalter enthalten, die auf die gleiche Weise wie bei util.format() interpretiert werden.

console.log('String: %s Number: %d Percent: %%', 'abc', 123);

const obj = {one: 1, two: 2};
console.log('JSON: %j Object: %o', obj, obj);

// Output:
// 'String: abc Number: 123 Percent: %'
// 'JSON: {"one":1,"two":2} Object: { one: 1, two: 2 }'

Alle Argumente nach dem ersten werden immer in der Ausgabe angezeigt, auch wenn nicht genügend Platzhalter dafür vorhanden sind.

11.1.2 Schreiben in stdout über einen Node.js-Stream

process.stdout ist eine Instanz von stream.Readable. Das bedeutet, dass wir sie wie jeden anderen Node.js-Stream verwenden können – zum Beispiel:

process.stdout.write('two');
process.stdout.write(' words');
process.stdout.write('\n');

Der vorherige Code ist äquivalent zu:

console.log('two words');

Beachten Sie, dass in diesem Fall kein Zeilenumbruch am Ende steht, da console.log() immer einen hinzufügt.

Wenn wir .write() mit großen Datenmengen verwenden, sollten wir die Rückstauung berücksichtigen, wie in §9.5.2.1 „writable.write(chunk) erläutert.

Die folgenden Rezepte funktionieren mit process.stdout: §11.4 „Node.js Stream-Rezepte“.

11.1.3 Schreiben in stdout über einen Web-Stream

Wir können process.stdout in einen Web-Stream konvertieren und hineinschreiben.

import {Writable} from 'node:stream';
const webOut = Writable.toWeb(process.stdout);
const writer = webOut.getWriter();
try {
  await writer.write('First line\n');
  await writer.write('Second line\n');
  await writer.close();
} finally {
  writer.releaseLock()
}

Die folgenden Rezepte funktionieren mit webOut: §11.5 „Web-Stream-Rezepte“.

11.2 Schreiben in die Standardfehlerausgabe (stderr)

Das Schreiben in stderr funktioniert ähnlich wie das Schreiben in stdout.

  • Wir können über console.error() hineinschreiben.
  • Wir können über einen Node.js-Stream hineinschreiben.
  • Wir können über einen Web-Stream hineinschreiben.

Weitere Informationen finden Sie im vorherigen Abschnitt.

11.3 Lesen aus der Standardeingabe (stdin)

Dies sind Optionen zum Lesen aus stdin.

  • Wir können über einen Node.js-Stream lesen.
  • Wir können über einen Web-Stream lesen.
  • Wir können das Modul 'node:readline' verwenden.

11.3.1 Lesen aus stdin über einen Node.js-Stream

process.stdin ist eine Instanz von stream.Writable. Das bedeutet, dass wir sie wie jeden anderen Node.js-Stream verwenden können.

// Switch to text mode (otherwise we get chunks of binary data)
process.stdin.setEncoding('utf-8');
for await (const chunk of process.stdin) {
  console.log('>', chunk);
}

Die folgenden Rezepte funktionieren mit webIn: §11.4 „Node.js Stream-Rezepte“.

11.3.2 Lesen aus stdin über einen Web-Stream

Zuerst müssen wir process.stdin in einen Web-Stream konvertieren.

import {Readable} from 'node:stream';
// Switch to text mode (otherwise we get chunks of binary data)
process.stdin.setEncoding('utf-8');
const webIn = Readable.toWeb(process.stdin);
for await (const chunk of webIn) {
  console.log('>', chunk);
}

Die folgenden Rezepte funktionieren mit webIn: §11.5 „Web-Stream-Rezepte“.

11.3.3 Lesen aus stdin über das Modul 'node:readline'

Das eingebaute Modul 'node:readline' ermöglicht es uns, Benutzer interaktiv zur Eingabe von Informationen aufzufordern – zum Beispiel:

import * as fs from 'node:fs';
import * as readline from 'node:readline/promises';

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const filePath = await rl.question('Please enter a file path: ');
fs.writeFileSync(filePath, 'Hi!', {encoding: 'utf-8'})

rl.close();

Weitere Informationen zum Modul 'node:readline' finden Sie unter:

11.4 Node.js Stream-Rezepte

Lesbare Streams

Beschreibbare Streams

11.5 Web-Stream-Rezepte

Erstellen eines ReadableStream aus

Lesen aus einem ReadableStream

Transformation von ReadableStreams

Verwenden von WritableStreams