Node.js を使用したシェルスクリプト
この本のオフライン版 (HTML、PDF、EPUB、MOBI) を購入して、無料のオンライン版をサポートできます。
(広告です。ブロックしないでください。)

11 ストリームレシピ



11.1 標準出力 (stdout) への書き込み

stdout に書き込むための 3 つのオプションがあります

11.1.1 `console.log()` を使用した stdout への書き込み

console.log(format, ...args) は stdout に書き込み、常に改行 '\n' を追加します (Windows でも)。最初の引数には、util.format() と同じ方法で解釈されるプレースホルダーを含めることができます。

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 }'

2 番目以降のすべての引数は、プレースホルダーの数が十分でない場合でも、常に出力に表示されます。

11.1.2 Node.js ストリームを使用した stdout への書き込み

process.stdoutstream.Readable のインスタンスです。つまり、他の Node.js ストリームと同様に使用できます。例えば

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

上記のコードは以下と同等です

console.log('two words');

console.log() は常に改行を追加するため、この場合は末尾に改行がないことに注意してください。

大量のデータで .write() を使用する場合は、§9.5.2.1 “writable.write(chunk) で説明されているように、バックプレッシャーを考慮する必要があります。

次のレシピは process.stdout で動作します: §11.4 “Node.js ストリームレシピ”

11.1.3 Web ストリームを使用した stdout への書き込み

process.stdout を Web ストリームに変換して書き込むことができます

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

次のレシピは webOut で動作します: §11.5 “Web ストリームレシピ”

11.2 標準エラー出力 (stderr) への書き込み

stderr への書き込みは、stdout への書き込みと同様に機能します

詳細については、前のセクションを参照してください。

11.3 標準入力 (stdin) からの読み取り

stdin から読み取るためのオプションは次のとおりです

11.3.1 Node.js ストリームを使用した stdin からの読み取り

process.stdinstream.Writable のインスタンスです。つまり、他の Node.js ストリームと同様に使用できます

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

次のレシピは webIn で動作します: §11.4 “Node.js ストリームレシピ”

11.3.2 Web ストリームを使用した stdin からの読み取り

最初に process.stdin を Web ストリームに変換する必要があります

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

次のレシピは webIn で動作します: §11.5 “Web ストリームレシピ”

11.3.3 `'node:readline'` モジュールを使用した stdin からの読み取り

組み込みモジュール `'node:readline'` を使用すると、ユーザーに対話的に情報を入力するように促すことができます。例えば

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

`'node:readline'` モジュールの詳細については、以下を参照してください。

11.4 Node.js ストリームレシピ

読み取り可能なストリーム

書き込み可能なストリーム

11.5 Web ストリームレシピ

ReadableStream を作成する

ReadableStream から読み取る

ReadableStream の変換

WritableStream の使用