2012-02-10 97 views
17

我有一个node.js脚本/服务器,它在启动时从stdin读取一些输入。但是,有时候没有数据要传入。这很麻烦,因为在这种情况下,似乎既不调用data也不调用end事件。如何在node.js代码中检测到这种情况?node.js:如何检测一个空的标准输入流?

我想,以避免在输入的末尾追加特殊的“端”字,以免带来不便的客户。相关联的代码如下:

var newHTML = ''; 
    var gfm = spawn(__dirname + '/node_modules/docter/bin/github-flavored-markdown.rb'); 
    process.stdin.on('data', function(chunk){ 
    gfm.stdin.write(chunk); 
    }); 
    process.stdin.on('end', function(){ 
    gfm.stdin.end(); 
    }); 
    gfm.stdout.on('data', function(data) { 
    newHTML += data; 
    }); 
    gfm.on('exit',function(ecode){ 
    socket.emit('newContent', newHTML); 
    }); 
    process.stdin.resume(); 
+1

你试过process.stdin.on( '错误',函数(){})? – Marshall 2012-02-10 17:28:11

+0

或gfm.stdout.on('error',function(){}) – Marshall 2012-02-10 17:28:33

+0

找到了解决方案?这似乎不可能。 – antitoxic 2013-07-21 14:32:29

回答

3

一个空的或者没有STDIN流由从process.stdinend事件检测。

这个简单的脚本stdin.js表明:

process.stdin.on('data', function(data) { console.log(data) }); 
process.stdin.on('end', function() { console.log('EOF') }); 

不同的方案:

$ echo test | node stdin.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node stdin.js 
EOF 
$ node stdin.js < /dev/null 
EOF 
$ 

这个脚本pipe.js表明,使用管的派生子进程工作得很好:

var spawn = require('child_process').spawn; 
var cat = spawn('/bin/cat'); 
cat.stdout.on('data', function(data) { console.log(data) }); 
cat.stdout.on('end', function() { console.log('EOF') }); 

process.stdin.pipe(cat.stdin); 

正如预期的那样:

$ echo test | node pipe.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node pipe.js 
EOF 
$ node pipe.js < /dev/null 
EOF 
$ 
4

我相信可能发生的事情是,你根本没有给stdin蒸汽。

奥伊斯坦Steimler的例子表明您喂养的/ dev/null的到您的应用程序:

节点pipe.js <的/ dev/null的

但是,从来没有当你不流处理stdin到应用程序。只是运行node pipe.js将不会退出,因为它仍在等待stdin

您可以与其他UNIX程序自己进行测试,例如cat

尝试运行此:

cat < /dev/null 

现在尝试只是运行:

cat 

它不会退出,因为它正在等待stdin。您可以输入终端并按回车键发送到程序。它仍然不会退出(并等待更多的输入),直到接收到EOF,您可以用CTRL做 + d

+2

如何检测这种情况何时发生?我没有收到任何'readline''close'或'process.stdin'' end'事件。 – spiffytech 2017-02-21 15:46:32

1

有些事情,你可以做的是让你的应用程序接受参数一样-s这使其从标准输入读取。

这就是为LiveScript的CLI工具的作用:

-s, --stdin read stdin