expressでPOSTデータをJSONにする

なおexpressはレスポンスを返すときのJSONは適切に処理してくれるんだけど、現状ではリクエストとしてJSONがPOST/PUTされてきたときにはそれをどうにかしてくれたりしないので、自分で JSON.parse() にかけてやる必要があったりしてちょっと残念。その点、フォーム形式だと app.use(express.bodyParser()); しておけばオブジェクトから取り出せるので便利でなんとなく納得のいかないものを感じる。

http://d.hatena.ne.jp/tagomoris/20110906/1315279065

これ、リクエストヘッダでContentTypeをapplication/jsonにすれば処理できたりする。

node側がこうで

var express = require('express');
var app = module.exports = express.createServer();
app.use(express.bodyParser());

app.post('/', function(req, res){
  res.send(req.body);
});

app.listen(3000);

普通にリクエストすると

$ curl -d '{"foo":"bar"}' http://localhost:3000/ 
{"{\"foo\":\"bar\"}":""

こう残念な感じだけどContentTypeをapplication/jsonにすればJSONとして処理される。

$ curl -H 'Content-Type: application/json' -d '{"foo":"bar"}' http://localhost:3000/    
{"foo":"bar"}

jQueryの場合はこうかな。

$.ajax({
  url: '/',
  type: 'POST',
  data: JSON.stringify({ foo: 'bar' }),
  contentType: 'application/json',
  success: function(data) {
    console.log(data)
  }
})

ちなみに実際に処理してるのはconnect/middleware/bodyParserのこの辺なんだけど
https://github.com/senchalabs/connect/blob/1.7.1/lib/middleware/bodyParser.js#L89-92
exportsされてるので

express.bodyParser.parse['application/x-hoge'] = function(body) {
  // なんか独自のパース処理
}

なんてことも可能っちゃ可能。