所以我需要在终端中使用输入文件,当我编写以下cat input.txt | node prog.js >result.txt
我的代码是:
var fs = require('fs');
var str = fs.readFileSync('input.txt', 'utf8');
str.replace(/^s*[rn]/gm,"").split(/s+/).forEach(function (s) {
return console.log(
s === 'bob'
? 'boy'
: s === 'alicia'
? 'girl'
: s === 'cookie'
? 'dog'
: 'unknown');
});
我需要我的代码来获取输入文档,而不管用户可能为其指定的名称如何。获取用户输入的正确方法是什么?
如果将值管道传输到节点.js脚本,则必须侦听process
对象可用的readable
或data
事件侦听器。使用data
事件侦听器将流直接置于流动模式,每当使用readable
事件侦听器时,都必须使用process.stdin.read()
强制 stdin 进入流动模式。要写入另一个命令或另一个脚本,您必须使用process.stdout.write()
,它是一个可写的流。
流动模式
#!/usr/bin/env node
let chunks = "";
process.stdin.on("data", data => {
// data is an instance of the Buffer object, we have to convert it to a string
chunks += data.toString();
})
// the end event listener is triggered whenever there is no more data to read
process.stdin.on("end", () => {
// pipe out the data to another command or write to a file
process.stdout.write(chunks);
});
非流动模式
#!/usr/bin/env node
process.stdin.on("readable", () => {
const flowingMode = process.stdin.read();
// flowingMode will become null, whenever there is no more data to read
if ( flowingMode )
chunks += flowingMode.toString();
})
process.stdin.on("end", () => {
process.stdout.write(chunks);
})
为了防止自己承受所有这些压力,如果readable
或data
事件处理程序上没有逻辑,您可以执行以下操作
#!/usr/bin/env node
process.stdin.pipe(process.stdout);
如果你想在触发end
事件侦听器时做一些事情,你应该这样做
#!/usr/bin/env node
process.stdin.pipe(process.stdout, { end: false } );
process.stdin.on("end", () => /* logic */ );
触发end
事件侦听器时,执行代码
#!/usr/bin/env node
let chunk = "";
process.stdin.on("data", data => {
chunk += data.toString();
});
process.stdin.on("end", () => {
chunk.replace(/^s*[rn]/gm,"").split(/s+/).forEach(function (s) {
process.stdout.write(
s === 'bob'
? 'boy'
: s === 'alicia'
? 'girl'
: s === 'cookie'
? 'dog'
: 'unknown');
});
});
> cat input.txt | ./prog.js > result.txt
将某些内容管道到节点脚本中确实需要您从process.stdin
中读取,正如@T.J.Crowder所提到的。
看看这篇文章,它解释了这个想法,并有一个很好的例子可以遵循: https://blog.rapid7.com/2015/10/20/unleash-the-power-of-node-js-for-shell-scripting-part-1/例如:
#!/usr/bin/env node
const readInput = callback => {
let input = '';
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
const chunk = process.stdin.read();
if (chunk !== null) {
input += chunk;
}
});
process.stdin.on('end', () => callback(input));
}
readInput(console.log);
你要问的是"如何从标准输入中读取?答案是用process.stdin
,这是一个Stream
。