Edited at

Node.jsの標準入力と

More than 3 years have passed since last update.

当方windows8 x64 Node v10


readFileSyncを使う。一番簡潔

var input = require('fs').readFileSync('/dev/stdin', 'utf8');

けどこれはwindowsでは無理で、パイプのみ


readSyncを使う

var fs = require('fs');

var length = fs.fstatSync(process.stdin.fd).size;
var buffer = new Buffer(length);
var bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0);
var input = buffer.toString('utf8', 0, bytesRead);

fs.fstatSyncでstdinのサイズをしらべてから、fs.readSyncで読み込む。

しかし、これもパイプのみ。


process.stdinのイベントを監視する。

参照

var input = '';

process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
input += chunk;
});
process.stdin.on('end', function() {
//do something
});

この方法だとwindows環境ではCtrl+Dを押してもendイベントが発生しないようだ。


readlineモジュールを使う

var lines=[];

var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', function (line) {
lines.push(line);
});
reader.on('close', function () {
//do something
});

このやり方のメリットは改行コードを気にしなくていいし、

Ctrl+Dをおせばcloseイベントが発生する。

しかし、パイプを使うとなぜかcloseイベントが発生しない。

issueを見ると、これはバグで修正されていないようだ。

なので

var lines = [];

var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', function (line) {
lines.push(line);
});
process.stdin.on('end', function () {
//do something
});

なかなか不自然である。


まとめ

どのやり方も面倒