如何使用nodeJS从stdin读取文件

时间:2019-07-18 22:30:07

标签: node.js pipe stdin node-streams

我正在创建要从命令行运行的节点应用程序。作为输入,它应该输入.txt或.json文件,对数据执行一些操作,然后将某些内容返回到stdout。但是,我不知道如何从stdin中读取文件。这就是我现在所拥有的。我是从nodeJS documentation复制过来的。

process.stdin.on('readable', () => {
  let chunk;
  // Use a loop to make sure we read all available data.
  while ((chunk = process.stdin.read()) !== null) {
    process.stdout.write(`data: ${chunk}`);
  }
});

process.stdin.on('end', () => {
  process.stdout.write('end');
});

如果我从命令行运行该程序,则可以在stdin中键入一些内容,并在stdout中看到它返回。但是,如果我跑步 node example.js < example.json从命令行中,我得到了错误 stdin is not a tty。我知道管道传输文件意味着它不是从tty读取,但是我的代码的哪一部分要求从tty读取?

我该怎么做才能从stdin中读取文件?

谢谢!

1 个答案:

答案 0 :(得分:0)

看看https://gist.github.com/kristopherjohnson/5065599

如果您更喜欢基于 Promise 的方法,这里是该代码的重构版本,希望对您有所帮助

function readJsonFromStdin() {
  let stdin = process.stdin
  let inputChunks = []

  stdin.resume()
  stdin.setEncoding('utf8')

  stdin.on('data', function (chunk) {
    inputChunks.push(chunk);
  });

  return new Promise((resolve, reject) => {
    stdin.on('end', function () {
      let inputJSON = inputChunks.join()
      resolve(JSON.parse(inputJSON))
    })
    stdin.on('error', function () {
      reject(Error('error during read'))
    })
    stdin.on('timeout', function () {
      reject(Error('timout during read'))
    })
  })
}

async function main() {
  let json = await stdinReadJson();
  console.log(json)
}

main()