【问题标题】:How to read a file from stdin with nodeJS如何使用 nodeJS 从标准输入读取文件
【发布时间】:2019-11-27 21:54:11
【问题描述】:

我正在创建一个我想从命令行运行的节点应用程序。作为输入,它应该接受一个 .txt 或 .json 文件,对数据执行一些操作,并将某些内容返回到标准输出。但是,我无法弄清楚如何从标准输入读取文件。这就是我现在所拥有的。我从 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');
});

如果我从命令行运行这个程序,我可以在标准输入中输入一些东西,然后在标准输出中看到它返回。但是,如果我跑 node example.js < example.json 从命令行,我得到错误 stdin is not a tty。我知道管道文件意味着它不是从 tty 读取,但是我的代码的哪一部分要求它从 tty 读取?

如何从标准输入读取文件?

提前致谢!

【问题讨论】:

标签: node.js pipe stdin node-streams


【解决方案1】:

看看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 readJsonFromStdin();
  console.log(json)
}

main()

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多