我正在创建要从命令行运行的节点应用程序。作为输入,它应该输入.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中读取文件?
谢谢!
答案 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()