$_POSTで受け取れなくて困ったのでメモ。
結論
結論から言うと
request.post(url).type('form').send(option).end(cb);
のように.type('form')使いましょう。
(cbはコールバック関数です)
解説
Content-Typeと送信する値について
まずPOST通信するときに送る値の話をします。実は送る値はapplication/json形式、application/x-www-form-urlencoded形式、multipart/form-dataなど様々あります。そしてそれぞれデータのフォーマットが異なります。
PHPは受け取ったデータをapplication/x-www-form-urlencodedで解釈し、パース後$POSTに入れます。そのため、application/jsonて送信するとフォーマットが異なるため$POSTが空となります。
SuperAgentが送信するContent-Type
SuperAgentは実はsendに渡したデータによってデフォルトのContent-typeを決定しています。
request.post(url).send({data: data}).end(cb); // json request.post(url).send('{"data":"' + data + '"}').end(cb); // json request.post(url).send('data=' + data); //form
つまり、sendに 'data=data'
という形式で渡さないと$_POSTで受け取れません。でも、オブジェクトをそのまま渡したいですよね。
そこで、自動ではなく手動でContent-Typeを宣言します。
request.post(url).type('form').send({data: data}).end(cb);
typeメソッドに引数として 'form' 、 'form-data' 、 'urlencoded' のいずれかを渡すとContent-Typeがapplication/x-www-form-urlencodedとなります。
終わりに
地味に悩みましたよ…おかげでいろいろ学べたのでいいですが。