2016-08-08 60 views
0

我想爲使用Node.js的readline模塊從用戶打印和捕獲信息的CLI編寫測試,但我似乎無法捕獲任何東西標準輸出。我正面臨的一個簡單版本的問題如下。readline.write()沒有到達標準輸出

app.js:

#!/usr/bin/env node 

const readline = require('readline') 
const rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout 
}) 

rl.write('hello\n') 
process.exit() 

runner.js:運行runner.js

const spawn = require('child_process').spawn 

const rl = spawn(__dirname + '/app.js') 

rl.stdout.on('data', chunk => { 
    console.log('stdout says', chunk.toString()) 
}) 

,我希望看到的輸出stdout says hello,但是不打印。

但是,如果我直接運行app.js,則hello會打印到控制檯。此外,如果我使用其他readline方法(如question),處理程序將使用期望的數據進行觸發。

爲什麼不按預期工作?如何改變工作?

回答

1

涉及Readline output to file Node.js

爲了捕捉rl.write的輸出(),一個解決方案是:在創建的readline接口實例當定義「終端」爲真。

樣品的編號:

const readline = require('readline'); 
const rl = readline.createInterface({ 
    input: process.stdin, 
    output: process.stdout, 
    terminal: true 
}); 

說明:在node.js的 readline的模塊僅當 「終端」 是真實的數據寫入到 「輸出」 流。否則,它只是發出「行」事件,並將數據發送到行事件處理程序。根據源代碼(https://github.com/nodejs/node/blob/master/lib/readline.js):

首先,檢查是否配置了「terminal」。如果不是,使其等於輸出流的isTTY屬性:

if (terminal === undefined && !(output === null || output === undefined)) { 
    terminal = !!output.isTTY; 
} 
... 
this.terminal = !!terminal; 

其次,當rl.write()函數被調用時,它會調用_ttyWrite()或_normalWrite(),這取決於是否「終端」是真的:

Interface.prototype.write = function(d, key) { 
    ... 
    this.terminal ? this._ttyWrite(d, key) : this._normalWrite(d); 
}; 

最後,如果_ttyWrite()被調用,數據將被髮送到輸出流。如果_normalWrite()被調用時,輸出流被忽略:

//Interface.prototype._ttyWrite will invoke Interface.prototype._insertString, which will call Interface.prototype._writeToOutput 
Interface.prototype._writeToOutput = function _writeToOutput(stringToWrite) { 
    ... 
    if (this.output !== null && this.output !== undefined) 
    this.output.write(stringToWrite); 
}; 

因此,當app.js在直接控制檯運行,「你好」將被打印,「末端」是等於process.stdout.isTTY ,這是真的。但是,在子進程中執行時,「終端」爲false(如果未配置),因爲process.stdout.isTTY現在未定義。

+0

該解決方案有效,但爲什麼? readline接口已經連接到stdout,其輸出被'data'處理程序讀取,而不是終端。 – user6689821

+0

@ user6689821,現在在回答中加上解釋:) – shaochuancs

+0

謝謝@shaochuancs。我仍然有點困惑,爲什麼'write'會默認忽略輸出流(爲什麼要寫它,如果它不寫?),但我真的很感謝你通過代碼。 – user6689821

相關問題