2017-06-25 2 views
0

child_process.execを使用して、curlをlongコマンドで呼び出して、データをAPIに送信しようとしました。以下の例のような何か:child_process.execのcurlコマンドに変数を渡すのに失敗しました

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のレポは、そのgit log出力に複数の行が含まれ、その後、あなたは(ここでは、ifttt.comでシンプルなウェブフック)いくつかのAPIに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を実行しています。

+0

'exec'の代わりに' spawn'を使うことができます。 'spawn'はargsを配列として受け取ります。したがって、文字列の連結は必要ありません。 –

+0

興味深い。はい、それを行うより良い方法のように聞こえます。あなたはそれを使用する方法の例を投稿できますか? –

+0

私はそれを動作させることができました。これは良い改善です: 'spawn( 'curl'、['-H" Content-Type:application/json "'、 '-X POST'、 '-d \" {"value1": "\" "$ arg" \ '"} \"'、]、...「ありがとう! –

答えて

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, '') } }); 
    } 
}) 

何が起こっていることは、あなたの変数「標準入力が」(あなたが「STDOUT」に名前を変更しなければならない)ということで、それの終わりに\nを持っています。

+0

ありがとう、確かにそれはうまくいきますが、私はこのようなコマンドを呼び出すための簡単な方法を、 –

+1

@RobertSmith答えに説明を追加しました。パラメータstdinをstdoutに変更する必要があります。これは実際に実行されたコマンドの 'stdout'です。なぜなら、curl 'Node.js自体から' POST'を実行するのではなく、 –

+0

あなたは正しいです、それは 'stdout'でなければなりません。 –

関連する問題