Node.js 点头。Child_process.spawn。处理流程';输入提示

Node.js 点头。Child_process.spawn。处理流程';输入提示,node.js,git,stream,child-process,Node.js,Git,Stream,Child Process,我目前正在为git开发web界面。通过child_process.spawn访问git本身。虽然有简单的“command->response”机制,但一切都很好,但我无法理解如何处理命令提示(git fetchasks for password)。假设发生了一些事件,但我不知道该听什么。我看到的只是“git”_user@myserver的密码:“在node.js进程本身正在运行的命令行中 将此请求重定向到我的web应用程序中会很好,但这可能吗 我尝试在所有流(stdout、stdin、stder

我目前正在为git开发web界面。通过child_process.spawn访问git本身。虽然有简单的“command->response”机制,但一切都很好,但我无法理解如何处理命令提示(
git fetch
asks for password)。假设发生了一些事件,但我不知道该听什么。我看到的只是“
git”_user@myserver的密码:
“在node.js进程本身正在运行的命令行中

将此请求重定向到我的web应用程序中会很好,但这可能吗

我尝试在所有流(stdout、stdin、stderr)上收听
消息
数据
管道
结束
关闭
可读
,但没有人在密码提示下开火

以下是我的工作解决方案(未提及实验):

你能帮我调查一下吗

更新

当前情况:在我的GitWeb界面上有一个按钮“FETCH”(例如,简单的“GitFetch”)。当我按下它时,http请求被生成并发送到node.js服务器,该服务器由
http.createServer(回调)创建。listen(8080)
<代码>回调函数接收我的请求并创建子进程。spawn('git',['-C','path/to/local/repo','fetch'])。一直以来,我在web界面上只看到加载屏幕,但如果切换到运行节点脚本的命令行窗口,我将看到一个密码提示。现在让我们假设我不能将窗口切换到控制台,因为我是远程工作的

我想在我的web界面上看到密码提示。例如,如果child_进程在提示用户输入时会在
child.stdin
(或其他地方)上发出一些事件,这将非常容易实现。在这种情况下,我会发送字符串“加油,老兄,git想知道你的密码!在这里输入:_______________;”返回到web客户端(通过
response.end(str)
),并将继续等待下一个包含所需密码的http连接。然后简单地
child.stdin.write(pass)
it到git进程

这个解决方案可行吗?或者不涉及父进程的命令行

更新2

只是尝试将侦听器附加到官方文档中描述的所有可能事件:stdout和stderr(可读、数据、结束、关闭、错误)、stdin(drain、finish、pipe、unpipe、error)、child(message、exit、close、disconnect、message)

将git流传输到process.stdout、process.stderr后,尝试了相同的侦听器


密码请求时不会触发任何操作…

代码无法工作的主要原因是,只有在执行之后才能发现Git进程发生了什么

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

我刚刚试过这个代码,效果很好。下面是生成一个进程以执行git推送的示例。然而,正如您可能知道的,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);
  • 制作一个本地git repo并进行设置,这样就可以执行上面的push命令。但是,您确实可以执行任何git命令
  • 将其复制到名为git_process.js的文件中
  • 使用节点git_process.js运行

  • 不知道这是否有帮助,但我发现拦截子进程提示的唯一方法是在生成新的子进程时将detached选项设置为true

    和你一样,我在互联网站的节点中找不到任何关于子进程提示的信息。有人会怀疑它应该去stdout,然后你就必须写信给stdin。如果我没记错的话,您可能会发现提示被发送到stderr


    其他人没有这个问题,这让我有点惊讶。也许我们只是做错了。

    嗯,也许我比我想象的更“新手”,但我真的不知道我需要在代码中应用什么。直接复制粘贴(使用我的变量名)会导致外部模块中出现异常。将密码作为属性传递给git(如果我没有弄错的话)不是一个选项,因为并非所有存储库都需要它。外部模块也不是我的选择,因为我想让“内部流程”对我来说更清晰,而不是像魔法一样思考它。我不确定是否要将一个流直接导入另一个流。在我的例子中,我有两个对象:
    http.Server
    childprocess
    。第一个是流
    http.IncomingMessage
    (可读)和
    http.ServerResponse
    (可写)。ChildProcess有
    stdout
    stdin
    stderr
    。我想我需要保持
    ChildProcess
    进程处于活动状态,同时将其请求重定向到http。服务器总是关闭连接,并等待它再次打开以获得客户端响应。所以我看不到直接用管道输送的方法。(顺便说一句,如果我的英语真的不好,我很抱歉)streams的目的是提供一种通用机制,将数据从一个位置传输到另一个位置。当数据可读取时,它们还公开事件,如数据。我会尽量想出更多的复制粘贴的例子。嗯。。。好啊这对我有什么帮助?然而,我看到了与我在上一个案例中看到的相同的画面:命令行提示输入密码。我应该如何“捕获”密码请求并将其作为字符串重定向到其他流?正如一个猜测尝试附加到文件
    process.stdout.on(“data”,function(){console.log(“data”)}
    的末尾,然后用
    end
    message
    替换
    data
    。猜错了,没有开火。我将尝试更新我的问题,以更准确地描述我的期望。停留在同一个地方。你找到解决办法了吗@不幸的是,没有。仍在切换到我的终端以获取提示。。。
    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);