所以我需要在终端中以及在编写以下cat input.txt | node prog.js >result.txt
我的代码是:
var fs = require('fs');
var str = fs.readFileSync('input.txt', 'utf8');
str.replace(/^\s*[\r\n]/gm,"").split(/\s+/).forEach(function (s) {
return console.log(
s === 'bob'
? 'boy'
: s === 'alicia'
? 'girl'
: s === 'cookie'
? 'dog'
: 'unknown');
});
我需要我的代码来获取输入文档,而不管用户可以给它起什么名字。掌握用户输入的正确方法是什么?
答案 0 :(得分:2)
如果将值传递给node.js脚本,则必须侦听readable
对象可用的data
或process
事件侦听器。使用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*[\r\n]/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
答案 1 :(得分:1)
如@ T.J.Crowder所述,将某些内容添加到Node脚本中确实需要您从process.stdin
阅读。
请看一下这篇文章,它解释了这个想法,并附有一个很好的例子: 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);
答案 2 :(得分:0)
您要问的是“如何从标准输入中读取内容?”答案是使用process.stdin
,即Stream
。