2012-02-10 41 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