节点。Child_process.spawn。处理进程的输入提示

Mad*_*zeR 5 git stream child-process node.js

我目前正在处理我的 git 网络界面。通过 child_process.spawn 访问 git 本身。一切都很好,虽然有简单的“命令 - > 响应”机制,但我不明白我应该用命令提示符做什么(git fetch例如要求输入密码)。假设有一些事件被触发,但我不知道该听什么。我所看到的只是git_user@myserver's password: _node.js 进程本身正在运行的命令行中的“ ”。

将此请求重定向到我的 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);
});
Run Code Online (Sandbox Code Playgroud)

你能帮我做调查吗?

更新

当前情况:在我的 GIT Web 界面上有一个按钮“FETCH”(例如,简单的“git fetch”)。当我按下它时,会生成 http 请求并将其发送到由http.createServer(callback).listen(8080). callback函数接收我的请求并创建child_process.spawn('git',['-C','path/to/local/repo','fetch']). 一直以来,我只在 Web 界面上看到加载屏幕,但是如果我切换到运行节点脚本的命令行窗口,我将看到密码提示。现在让我们假设我无法将窗口切换到控制台,因为我是远程工作的。

我想在我的网络界面上看到密码提示。例如,如果 child_processchild.stdin在提示用户输入时会在(或其他地方)发出一些事件,这将很容易实现。在这种情况下,我会将字符串“来吧,伙计,git 想知道您的密码!在此处输入:_______”返回 Web 客户端(by response.end(str)),并将继续等待下一个带有客户端响应的 http 连接,其中包含所需的密码。然后简单地child.stdin.write(pass)把它交给 git 进程。

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

更新2

只是尝试将侦听器附加到官方文档中描述的所有可能的事件:stdout 和 stderr(可读、数据、结束、关闭、错误)、stdin(排水、完成、管道、取消管道、错误)、子(消息、退出、关闭、断开连接,消息)。

在将 git 流通过管道传输到 process.stdout、process.stderr 后尝试使用相同的侦听器。

密码请求没有任何触发...

Pet*_*uge 1

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

使用spawn的主要原因是因为spawned进程可以配置,并且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);
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个本地 git 存储库并进行设置,以便您可以执行上述推送命令。但是,您确实可以执行任何 git 命令。
  2. 将其复制到名为 git_process.js 的文件中。
  3. 使用节点 git_process.js 运行