使用 Node.js 撰寫 Shell 腳本
你可以購買此書的離線版本(HTML、PDF、EPUB、MOBI),並支持免費的線上版本。
(廣告,請不要封鎖。)

11 串流範例



11.1 寫入標準輸出(stdout)

有三個選項可以寫入 stdout

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

第一個引數之後的所有引數始終會顯示在輸出中,即使沒有足夠的佔位符。

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 透過網路串流寫入 stdout

我們可以將 process.stdout 轉換為網路串流並寫入其中

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 “網路串流食譜”

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 透過網路串流從 stdin 讀取

我們必須先將 process.stdin 轉換為網路串流

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 “網路串流食譜”

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 網路串流食譜

從以下建立 ReadableStream

從 ReadableStream 讀取

轉換 ReadableStreams

使用 WritableStreams