将变量传递给child_process.exec中的curl命令失败

时间:2017-06-25 19:22:08

标签: node.js curl exec

我试图使用child_process.exec使用long命令调用curl,以便将一些数据发送到API。类似于以下示例:

exec('git log --oneline | wc -l', function(error, stdin, stderr) { 
  if (stdin > 1) {
      exec('curl -H "Content-Type: application/json" -X POST -d \'{"value1": "\'"$arg"\'"}\' https://https://maker.ifttt.com/trigger/{event}/with/key/<my-key>', { "env" : {"arg": stdin } });
  }
})

因此,如果git repo在其git log输出中包含多行,那么您对某些API(此处为ifttt.com中的简单webhook)执行POST请求,其中您需要在过程中传递一些变量(arg)。

请注意,这是最好的尝试,但总的来说,我在努力避免单引号和双引号。在这种特殊情况下,HTTP请求未正确发送,因为正文包含换行符:

POST / HTTP/1.1
Host: <some-host>
User-Agent: curl/7.50.1
Accept: */*
Content-Type: application/json
Content-Length: 16

{"value1": "2
"}

最后,我不得不使用外部bash脚本:

exec('./send_request.sh $arg', { "env": {"arg": stdin } });

但我仍然非常好奇如何让它在同一个js文件中运行。

如果有帮助,我运行节点6.11.0并卷曲7.52.1。

1 个答案:

答案 0 :(得分:1)

尝试:

exec('git log --oneline | wc -l', function(error, stdin, stderr) { 
  if (stdin > 1) {
      exec('curl -H "Content-Type: application/json" -X POST -d \'{"value1": "\'"$arg"\'"}\' https://https://maker.ifttt.com/trigger/{event}/with/key/<my-key>', { "env" : {"arg": stdin.replace(/\n/g, '') } });
  }
})

发生的事情是你的变量&#st;&#39; (您应该将其重命名为&#39; stdout&#39; )在其末尾有\n