我正在尝试将 grep 结果通过管道传输到 nodejs 脚本中。我发现我应该从 process.stdin 接收数据。
我还发现了几种使用标准输入的方法。但它们是不同的,我无法找到有关它的所有信息。我知道四种方法(前 3 种以var data = ""
):
1)搜索结果中最受欢迎的
process.stdin.resume();
process.stdin.setEncoding( 'utf8' );
process.stdin.on('data', function(chunk) { data += chunk; });
process.stdin.on('end', function() { console.log('data: ' + data); });
2)看起来像第一个,但功能未知process.openStdin()
var stdin = process.openStdin();
stdin.on('data', function(chunk) { data += chunk; });
stdin.on('end', function() { console.log('data: ' + data); });
3)在文档中我读过调用stdin.resume()
将标准输入更改为“旧类型”。因此,如果我们没有调用“恢复” - 我们可以使用“可读”事件
process.stdin.setEncoding('utf8');
process.stdin.on('readable', function() { data += process.stdin.read(); });
process.stdin.on('end', function() { console.log('data: ' + data); });
4)使用模块readline。只要 grep 结果在多行中,并且我不需要自己拆分接收到的数据,它就非常有用。但很长一段时间我无法理解为什么所有信息都直接通过管道传输到标准输出。然后我发现我们可以在创建接口时传递空对象而不是 process.stdout ,并且数据不会通过管道传输到输出。
var readline = require('readline'),
//rl = readline.createInterface(process.stdin, process.stdout);
rl = readline.createInterface(process.stdin, {});
rl.on('line', function(data) { console.log('line: ' + data); });
5)我自己的变体。使用另一个模块“split” - 它允许从流中读取数据并按指定符号将数据划分为块(\r?\n
默认情况下)。我用它来处理套接字,并且只要 stdin 也是可读流 - 我们就可以在这里使用它。
var split = require('split');
process.stdin.setEncoding('utf8');
process.stdin.pipe(split()).on('data', function(data) { console.log('line: ' + data); });
我的问题是“什么是process.openStdin();
????"
我搜索了谷歌的每个页面,但没有找到任何关于此功能的文档!
另外,在搜索时我发现,nodejs 的官方文档很丑陋 - 没有提到可用的版本方法,没有对许多对象/方法的详细描述,没有用户评论。而这个方法(openStdin
) - 存在并且有效,但没有描述!搞什么???