node.jsでPOSTデータを扱うには、
dataイベントと
endイベントを登録します。
dataイベントはPOSTデータを受け取る時のイベントで、endイベントはPOSTデータ受信完了時に発生するイベントです。
リクエストのaddListenerに登録します。また、受信データのエンコーディングをUTF-8と定義しています。
var http = require('http');
var url = require('url');
var router = require('./router');
var requestHandler = require('./requestHandler');
var handle = new Object();
handle["/"] = requestHandler.start;
handle["/start"] = requestHandler.start;
handle["/end"] = requestHandler.end;
var server = http.createServer(function(req, res){
var postData = "";
var pathname = url.parse(req.url).pathname;
var query = url.parse(req.url).query;
// postデータをutf8にエンコーディング
req.setEncoding("utf8");
// dataイベント
req.addListener("data", function(chunk) {
postData = chunk;
});
// endイベント
req.addListener("end", function() {
router.route(handle, pathname, res, postData);
});
});
server.listen(8084,'127.0.0.1');
console.log('server start');
dataイベントではpostDataを足していくようにしています。これはPOSTデータが大きいと、いくつかにデータを分割してわたすため、postDataに足していくようにしないと正常にデータ受信できないためです。
endイベントのコールバック関数で、routeしてレスポンスを返すように変更しています。
ルータにはpostData引数が増えたので変更しています。postDataはそのままリクエストハンドラに引数で渡します。以下、ルータです。
function route(handle,pathname,res,postData) {
if (typeof handle[pathname] === 'function') {
handle[pathname](res,postData);
} else {
res.writeHead(404, {"Content-Type": "text/html"});
res.end();
}
}
exports.route = route;
リクエストハンドラも引数にpostDataを増やしています。
function start(res,postData) {
res.writeHead(200, {"Content-Type": "text/html"});
var body = '<html>'+
'<head>'+
'<meta http-equiv="Content-Type" content="text/html; '+
'charset=UTF-8" />'+
'</head>'+
'<body>'+
'<form action="/end" method="post">'+
'<textarea name="text" rows="20" cols="60"></textarea>'+
'<input type="submit" value="Submit text" />'+
'</form>'+
'</body>'+
'</html>';
res.write(body);
res.end();
}
function end(res,postData) {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write(postData);
res.end();
}
exports.start = start;
exports.end = end;
以下実行例です。最初の画面でsubmit buttonを押します。
初期表示画面
結果画面