(node.js)(javascript) 外部プログラムを呼び出して、それに標準入力をして、それの標準出力を取得する

node.jsに関する記事一覧→ node.jsのまとめ



今回想定したシチュエーションは、ちょっと特殊かもしれませんが

euc-jp文字コードの文字列をutf-8に変換したいけどiconvだとなんかうまくいかないので
外部プログラムのnkfを使って変換したものをまたスクリプト側で取得したい

とします、まあ nkfの部分を色々と別のものに読み替えればいいだけですね。

#!/usr/local/bin/node

// rubyと同じ感じでコンソールに出力できるように
const puts = console.log;
const print = (str)=>{process.stdout.write(str)};

// 外部プログラムを呼び出す準備
const exec = require('child_process').exec;

// ファイル操作をする準備
const fs = require('fs');

// euc-jp.txt には euc-jpの文字コードで書かれた内容が入っているとします
// 非同期モードだといろいろめんどくさいので readFileSyncの同期モードで読み込んでます
// これで euc_textにeuc-jpの文字列データ(データ自体はUint8Arrayの状態)が入っている状態を作ります
// (例えば requestで取得した「euc-jpで書かれたwebページ」の bodyのデータに相当します)
var euc_text = fs.readFileSync('euc-jp.txt');

// nkfを使って utf-8 に変換したいので
// 第一引数のコマンド部分は 'nkf -w -Lu'
// -Luオプションを付けることで改行コードをLFで統一してくれます
// 第二引数に外部プログラムの結果を受けるコールバック関数をセットします
// 外部プログラムの標準出力は stdoutにセットされています
const nkf = exec(
	'nkf -w -Lu',
	(err, stdout, stderr)=>{
		puts(stdout);
	}
)

// 外部プログラムの標準入力に euc_textの内容を流し込みます
nkf.stdin.write(euc_text);

// 外部プログラムの標準入力を閉じます
// これをやらないと終わりを待ち続けるのでスクリプトの実行が固まります
nkf.stdin.end();