Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor:调用方法执行shell(克隆git repo) 问题:_Git_Bash_Shell_Meteor - Fatal编程技术网

Meteor:调用方法执行shell(克隆git repo) 问题:

Meteor:调用方法执行shell(克隆git repo) 问题:,git,bash,shell,meteor,Git,Bash,Shell,Meteor,在Meteor中,如何从客户端调用方法(传递name),让服务器执行一些shell命令 方法功能基本上是:创建一个目录,然后用给定的名称克隆git repo 这是非常简单的东西,但Meteor就是做不到。我已经兜圈子好几个小时了。一切都在常规bash或节点中工作。此时此刻: 创建目录->服务器重新启动->meteor抛出一个错误,声称目录已经存在->meteor删除目录->服务器重新启动 代码: 更新1 如果我事先手动创建文件夹,以下代码将成功克隆repo: if (Meteor.isClien

在Meteor中,如何从客户端调用方法(传递
name
),让服务器执行一些shell命令

方法功能基本上是:创建一个目录,然后用给定的
名称克隆git repo

这是非常简单的东西,但Meteor就是做不到。我已经兜圈子好几个小时了。一切都在常规bash或节点中工作。此时此刻:

创建目录->服务器重新启动->meteor抛出一个错误,声称目录已经存在->meteor删除目录->服务器重新启动

代码: 更新1

如果我事先手动创建文件夹,以下代码将成功克隆repo:

if (Meteor.isClient) {
  Template.all.events({
    'click button': function() {
      Meteor.call('clone', this.name);
    }
  });
}


if (Meteor.isServer) {
  exec = Npm.require('child_process').exec;
  cmd = Meteor.wrapAsync(exec);
  Meteor.methods({
    'clone': function(name) {
      var dir, res;
      dir = process.env.PWD + "/projects/" + name;
      res = cmd(git clone git@gitlab.com:username/" + name + ".git " + dir);
      return res;
    }
  });
}
但是,如果我将
“mkdir”+dir
添加到
cmd
,我仍然存在相同的问题:

创建目录->服务器重新启动->meteor抛出一个错误,声称目录已经存在->meteor删除目录->服务器重新启动

解决方案: Meteor正在重新启动,因为其目录中的某些内容已更改(
projects
)。然后在启动时重新运行该方法。这是方法调用的另一个问题


更新1中的代码是解决方案。

您的Meteor.call代码不在事件的功能块中。像这样的方法应该会奏效:

if (Meteor.isClient) {
  Template.app.events({
    'click button': function() {
        Meteor.call('clone', "NAMEHERE", function(error, result) {
          if (error) {
            return console.log(error);
          } else {
            return console.log(result);
          }
        });
    }
  });
}

您的Meteor.call正常,问题似乎出在服务器端: 正确地使用wrapAsync打包exec npm对象,但随后错误地使用cmd var:只需发送一个如下参数:

var res = cmd("mkdir " + dir + "; git clone git@gitlab.com:username/" + name + ".git " + dir);
return res;
实际上,您的代码表明您希望向客户端返回不同的信息:

  • 我接到电话,命令挂起
  • 该命令已完成且正常或出错
  • 但事实上,它无法工作,因为使用wrapAsync cmd(…)将等待它完成,然后返回“Pending…” 因此,客户端将只收到“待定…”响应

    您真的需要通知客户机命令处于挂起状态,然后它就完成了吗?如果是,您可以使用状态集合来存储命令的状态(已接收/挂起/确定/错误…),然后在方法中只需更新集合,在客户端只需订阅此状态集合


    您可以看看这个项目,其中我使用服务器上的exec(带有重试包)和一个集合来管理挂起状态:

    我实际上使用的是coffeescript,我只是快速地执行了js2.coffee,但没有正确地检查它。谢谢though@offthegrass那么问题还在这里吗?@Rebolon是的,我还有问题。谢谢你。不,我根本不需要通知客户,所以我已经删除了这些退货。上面的代码重新启动服务器->抛出错误
    致命:目标路径。。。已存在
    ->重新启动服务器。我从
    cmd
    中删除了
    mkdir
    ,在调用之前手动创建了目录,它工作正常。可以调用另一个函数,比如说如果我想使用
    fs.mkdir
    ?明白了:meteor正在重新启动,因为它的目录中发生了变化。将
    projects
    重命名为
    .projects
    ,它可以正常工作。谢谢你的帮助。酷,我认为可以使用res进行多次呼叫。如果你在文件夹的末尾(或我不记得的开头)添加~,它将不会重新启动应用程序。你的问题中嵌入了大量元数据(“已解决”)在标题、“解决方案”标题和段落中。此元数据已经由StackOverflow的格式处理-接受的解决方案为绿色,您的问题清楚地显示为已回答。。。在问题本身而不是评论中添加更多数据是没有用的。@Kyll我没有添加任何数据。我改正了一些语法,移动了一个标题。
    var res = cmd("mkdir " + dir + "; git clone git@gitlab.com:username/" + name + ".git " + dir);
    return res;