Meteor:调用方法执行shell(克隆git repo) 问题:
在Meteor中,如何从客户端调用方法(传递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
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;
实际上,您的代码表明您希望向客户端返回不同的信息:
您可以看看这个项目,其中我使用服务器上的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;