Help us understand the problem. What is going on with this article?

Node.jsの標準入力と

More than 5 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
});

なかなか不自然である。

まとめ

どのやり方も面倒

herp
現場社員主導の採用活動である『スクラム採用』を実現する採用管理プラットフォーム「HERP ATS」を開発・運営しています。
https://herp.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away