我目前正在为我的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
流的目的是提供一个共同的机制,将数据从一个位置传输到另一个位置。当数据可以被读取时,它们还暴露诸如数据之类的事件。我会试着想出更多的复制和粘贴示例。 –