2015-11-02 81 views
2

我目前正在为我的git网页界面工作。通过child_process.spawn访问git本身。一切都很好,但有简单的“命令 - >响应”机制,但我不明白我该怎么处理命令提示符(例如git fetch要求输入密码)。假设有一些事件被解雇,但我不知道该听什么。我看到的只有命令行中的“[email protected]'s password: _”,其中node.js进程本身正在运行。NodeJS。 Child_process.spawn。处理过程'输入提示

将这个请求重定向到我的web应用程序会很好,但它甚至有可能吗?

我试图监听messagedatapipeendclosereadable在所有流(标准输出,标准输入,标准错误),但在密码提示没有一个火灾。

这是我工作的解决方案(没有提到的实验):

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流进行管道处理后,尝试了相同的监听器。

密码请求没有火灾......

回答

0

的最主要的原因,你的代码无法正常工作,是因为你只能找到与你的Git的过程中所发生的事情后,就是执行。

使用spawn的主要原因是因为可以配置派生进程,并且stdout和stderr是父进程中的可读流。

我刚刚试过这段代码,它工作得很好。这是一个产生执行git push的进程的例子。但是,正如你可能知道git会询问你的用户名和密码。

var spawn = require('child_process').spawn; 

var git = spawn('git', ['push', 'origin', 'master']); 

git.stderr.on('data', function(data) { 
    // do something with it 
}); 

git.stderr.pipe(process.stderr); 
git.stdout.pipe(process.stdout); 
  1. 拨打本地混帐回购协议和设置的东西,这样就可以做到以上push命令。但是,你真的可以做任何git命令。
  2. 将其复制到名为git_process.js的文件中。
  3. 与节点运行git_process.js
+0

嗯,也许我多一点“新手”,然后我想,但我真的不知道我需要什么来适用于我的代码。直接复制粘贴(使用我的变量名称)会导致外部模块出现异常。将密码传递给属性(如果我没有正确的)不是一种选择,因为并不是所有的存储库都需要它。外部模块也不是我的选择,因为我想让“内部流程”更加清晰,而不是像某种魔法那样思考。 – MadBrozzeR

+0

而且我不确定是否要将一个流直接流入另一个流。在我的情况下,我有两个对象:'http.Server'和'ChildProccess'。第一个流'http.IncomingMessage'(可读)和'http.ServerResponse'(可写)。 ChildProccess有'stdout','stdin','stderr'。我想我需要保持'ChildProcess'进程的活动状态,同时将请求重定向到http.Server,并始终关闭连接,并等待它再次打开,以便客户端响应。所以我看不出直接管道。 (P.S.对不起,如果我的英语真的很差) – MadBrozzeR

+0

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

0

不知道这是否会帮助,但我发现,拦截从子进程的提示的唯一方法是,当你产生一个新的子设置分离选项设置为true处理。

像你一样,我找不到任何有关interwebs节点上的子进程提示的信息。人们会怀疑它应该去标准输出,然后你必须写入标准输入。如果我没有记错,你可能会发现提示被发送到stderr。

对我来说有点神奇,其他人没有这个问题。也许我们只是做错了。