我目前正在爲我的git網頁界面工作。通過child_process.spawn訪問git本身。一切都很好,但有簡單的「命令 - >響應」機制,但我不明白我該怎麼處理命令提示符(例如git fetch
要求輸入密碼)。假設有一些事件被解僱,但我不知道該聽什麼。我看到的只有命令行中的「[email protected]'s password: _
」,其中node.js進程本身正在運行。NodeJS。 Child_process.spawn。處理過程'輸入提示
將這個請求重定向到我的web應用程序會很好,但它甚至有可能嗎?
我試圖監聽message
,data
,pipe
,end
,close
,readable
在所有流(標準輸出,標準輸入,標準錯誤),但在密碼提示沒有一個火災。
這是我工作的解決方案(沒有提到的實驗):
var out="";
var err="";
var proc=spawn(exe,cmd);
proc.on("exit",function(exitCode){
});
proc.stdout.on("data",function(data){
out+=data;
});
proc.stderr.on("data",function(data){
err+=data;
});
proc.on("close",function(code){
if(!code)func(out);
else return errHandler(err);
});
能否請您與我的調查,幫助我嗎?
UPDATE
現狀:我的GIT Web界面上有一個按鈕 「Fetch」(作爲一個例子,對於簡單的 「混帳提取」)。當我按下它時,會生成http請求並將其發送到由http.createServer(callback).listen(8080)
創建的node.js服務器。 callback
函數收到我的請求並創建child_process.spawn('git',['-C','path/to/local/repo','fetch'])
。所有這一次,我只看到我的Web界面加載屏幕,但如果我切換到節點腳本正在運行的命令行窗口,我會看到一個密碼提示。現在讓我們假裝我無法將窗口切換到控制檯,因爲我工作在遠程。
我想在我的Web界面上看到密碼提示。例如,如果child_process在提示用戶輸入時會在child.stdin
(或其他地方)發出某個事件,那麼實現起來會非常容易。在這種情況下,我會發送字符串「來吧,夥計,git想知道你的密碼!在這裏輸入:_______」回到web客戶端(通過response.end(str)
),並將繼續等待下一個http連接與客戶端響應,包含所需的密碼。然後簡單地child.stdin.write(pass)
它來攪拌過程。
此解決方案可能嗎?或者不涉及父進程的命令行。
UPDATE2
只是試圖聽衆附加到正式文檔中描述所有可能的事件:stdout和stderr(可讀,數據,結束,關閉,錯誤),標準輸入(漏極,光潔度,管,unpipe,錯誤),子(消息,退出,關閉,斷開連接,消息)。
在process.stdout,process.stderr上試着對git流進行管道處理後,嘗試了相同的監聽器。
密碼請求沒有火災......
嗯,也許我多一點「新手」,然後我想,但我真的不知道我需要什麼來適用於我的代碼。直接複製粘貼(使用我的變量名稱)會導致外部模塊出現異常。將密碼傳遞給屬性(如果我沒有正確的)不是一種選擇,因爲並不是所有的存儲庫都需要它。外部模塊也不是我的選擇,因爲我想讓「內部流程」更加清晰,而不是像某種魔法那樣思考。 – MadBrozzeR
而且我不確定是否要將一個流直接流入另一個流。在我的情況下,我有兩個對象:'http.Server'和'ChildProccess'。第一個流'http.IncomingMessage'(可讀)和'http.ServerResponse'(可寫)。 ChildProccess有'stdout','stdin','stderr'。我想我需要保持'ChildProcess'進程的活動狀態,同時將請求重定向到http.Server,並始終關閉連接,並等待它再次打開,以便客戶端響應。所以我看不出直接管道。 (P.S.對不起,如果我的英語真的很差) – MadBrozzeR
流的目的是提供一個共同的機制,將數據從一個位置傳輸到另一個位置。當數據可以被讀取時,它們還暴露諸如數據之類的事件。我會試着想出更多的複製和粘貼示例。 –