2017-02-09 63 views
0

當鍵入一個蒙戈殼未終止命令,它會返回三個點表示需要更多的投入來完成這個命令象下面這樣:如何獲得蒙戈外殼輸出(三點)對未終止命令

> db.test.find(
... { 
... 

我我正在使用nodejs child_process.spawn創建一個mongo shell進程並偵聽其輸出。我可以從mongo shell獲得標準和錯誤輸出,但是我無法獲得...輸出。下面是我的代碼的NodeJS:

const shell = spawn('mongo', params); 
     shell 
     .stdout 
     .on('data', (data) => { 
      winston.debug('get output ' + data); 

     }); 

     shell 
     .stderr 
     .on('data', (data) => { 
      const output = data + ''; 
      winston.error('get error output ', data); 

     }); 

我運行下面的代碼對外殼發送命令:

shell.stdin.write('db.test.find('); 

我徘徊爲什麼我不能得到上述方法...輸出。這是一個特殊的輸出嗎?

EDIT1

我試圖用node-ptypty.js。他們可以獲得...輸出,但它們將輸入和輸出數據混合在一起。它們不可能分開。 我也嘗試使用stdbufunbuffer來禁用緩衝區,但它仍然不起作用。 似乎nodejs child_process在交互式命令下不能很好地工作。

+0

從Node.js產生'mongo' shell的目標是什麼?相反,使用[MongoDB Node.js驅動程序](https://mongodb.github.io/node-mongodb-native/)會更直截了當。 – Stennie

回答

0

你的代碼不包括寫入你的子進程的標準輸入的任何內容,所以如果你得到的省略號表明不完整的命令,但事實上你根本沒有發送任何命令 - 不完整或其他。

前面已經說過,許多命令行實用程序在發現連接到它們的stdin/stdout的實際終端時行爲會有所不同。例如。當您直接運行它時,git log會將結果分頁,但當您將結果傳遞給其他一些命令(如git log | cat)時不會將結果分頁,因此這可能也是這種情況。

這也可能與緩衝有關 - 如果您的流是行緩衝的,那麼您將不會看到任何沒有以換行符結束的行。

真正的問題是:你看到>提示嗎?你有沒有發送任何命令到mongo shell?

Scritping交互式CLI工具可能會很棘手。例如。看看我不得不做測試一個非常簡單的互動節目在這裏:

我不得不創建兩個命名管道,確保標準輸入,標準錯誤和標準輸出沒有緩衝,然後使用一些其他的技巧,使其工作。這是一個shell腳本,但它僅僅是爲了向你展示一個例子。

+0

對不起,我沒有把stdin源代碼放在那裏。當我發送'db.test.find('在stdin上,我沒有從stdout或stderr得到任何輸出,我確實看到'>'提示符,但它顯示在控制檯上而不是偵聽器方法。 –