node.jsでPOSTデータを扱う
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を押します。

初期表示画面


結果画面


node.jsのquerystring
先ほどの結果では、text=POSTデータと表示されてしまっています。
querystringモジュールを使ってPOSTデータだけを取得することが出来ます。
リクエストハンドラを以下のように書き換えるだけです。

var querystring = require("querystring");

function start(res,postData) {
    console.log('rh');
    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(querystring.parse(postData).text);
        res.end();
}

exports.start = start;
exports.end = end;

Back to top

Information