Mad*_*zeR 5 git stream child-process node.js
我目前正在处理我的 git 网络界面。通过 child_process.spawn 访问 git 本身。一切都很好,虽然有简单的“命令 - > 响应”机制,但我不明白我应该用命令提示符做什么(git fetch例如要求输入密码)。假设有一些事件被触发,但我不知道该听什么。我所看到的只是git_user@myserver's password: _node.js 进程本身正在运行的命令行中的“ ”。
将此请求重定向到我的 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);
});
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 后尝试使用相同的侦听器。
密码请求没有任何触发...
你的代码无法工作的主要原因是你只有在执行之后才知道你的 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)