我正在Node.js中编写一个程序(在某些情况下)想要充当一个简单的过滤器:从stdin读取所有内容(直到文件末尾),进行一些处理,将结果写入stdout。 / p>
你如何做'从stdin'读取所有东西?到目前为止我发现的最接近的解决方案,似乎一次从控制台一行一行,或者只在stdin是文件而不是管道时工作。
答案 0 :(得分:19)
如果您使用的是Linux,则不需要第三方软件包。当然,请考虑您的性能需求,但这两行将起作用:
const fs = require("fs");
const data = fs.readFileSync("/dev/stdin", "utf-8");
Jan在下面的评论中指出,更便携的解决方案是使用0
,因为这是POSIX标准。所以,你可以简单地使用:
const fs = require("fs");
const data = fs.readFileSync(0, "utf-8");
data
现在是一个包含stdin数据的字符串,解释为utf 8
答案 1 :(得分:10)
get-stdin可以解决问题。
在你的问题的各行之间阅读一些注释。
由于您标记了问题"同步"我只是注意到stdin在node.js中只是async-only。上面的库是最简单的。它将整个输入作为字符串或缓冲区处理。
如果可能的话,以流媒体风格编写程序是最好的,但有些用例可用于流式传输(即字数统计),有些则不可用(即反向输入)。
同样来自控制台"一次一行#34;是终端缓冲你的击键的神器。如果你想要一些"对不起,我问过"水平细节检查了惊人的the TTY Demystified。
答案 2 :(得分:7)
我在Node 11+中使用以下内容
async function read(stream) {
let buffer = Buffer.alloc(0);
for await (const chunk of stream) {
buffer = Buffer.concat([buffer, chunk]);
}
return buffer.toString('utf8');
}
用法:
const input = await read(process.stdin);
答案 3 :(得分:5)
我为此编写的样板非常类似于上面的注释中描述的解决方案-在顶层提供它,因为这是执行此操作的最简单方法,并且不应仅在注释中进行。
var fs = require('fs');
var data = fs.readFileSync(0, 'utf-8');
// Data now points to a buffer containing the file's contents