node.jsでhttp GET/POSTデータの受け渡しを学ぶ

node.jsでhttp GET/POSTデータの受け渡しを学ぶ

GET/POSTの受け渡しは


まずは前回のhelloworldスクリプトを少し修正して、HTTPサーバが受け取ったパラメータを見てみる。

var ht = require('http');
ht.createServer(function (req, response){
  response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'});
  response.end('<html><body><h1>Hello <span style="color:#c99;">Node.js</span></h1></body></html>\n');
  console.log(req);
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');

これを

foo@ /z/home
$ node nd0606-01.js > nd0606-03request.txt

と実行して、中身を見る。

Server running at http://127.0.0.1:8124/
{ socket: 
   { _handle: 
      { writeQueueSize: 204,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 1,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 420,
     bytesWritten: 204,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Wed, 06 Jun 2012 10:30:40 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: null },
  connection: 
   { _handle: 
      { writeQueueSize: 204,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 1,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 420,
     bytesWritten: 204,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Wed, 06 Jun 2012 10:30:40 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: null },
  httpVersion: '1.1',
  complete: false,
  headers: 
   { host: '127.0.0.1:8124',
     connection: 'keep-alive',
     'cache-control': 'max-age=0',
     'user-agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko)  Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11',
     accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
     'accept-encoding': 'gzip,deflate,sdch',
     'accept-language': 'ja,en-US;q=0.8,en;q=0.6',
     'accept-charset': 'Shift_JIS,utf-8;q=0.7,*;q=0.3' },
  trailers: {},
  readable: true,
  url: '/',
  method: 'GET',
  statusCode: null,
  client: 
   { _handle: 
      { writeQueueSize: 204,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 1,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 420,
     bytesWritten: 204,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Wed, 06 Jun 2012 10:30:40 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: null },
  httpVersionMajor: 1,
  httpVersionMinor: 1,
  upgrade: false }
{ socket: 
   { _handle: 
      { writeQueueSize: 204,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 1,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 765,
     bytesWritten: 408,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Wed, 06 Jun 2012 10:30:41 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: null },
  connection: 
   { _handle: 
      { writeQueueSize: 204,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 1,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 765,
     bytesWritten: 408,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Wed, 06 Jun 2012 10:30:41 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: null },
  httpVersion: '1.1',
  complete: false,
  headers: 
   { host: '127.0.0.1:8124',
     connection: 'keep-alive',
     accept: '*/*',
     'user-agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko)  Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11',
     'accept-encoding': 'gzip,deflate,sdch',
     'accept-language': 'ja,en-US;q=0.8,en;q=0.6',
     'accept-charset': 'Shift_JIS,utf-8;q=0.7,*;q=0.3' },
  trailers: {},
  readable: true,
  url: '/favicon.ico',
  method: 'GET',
  statusCode: null,
  client: 
   { _handle: 
      { writeQueueSize: 204,
        socket: [Circular],
        onread: [Function: onread] },
     _pendingWriteReqs: 1,
     _flags: 0,
     _connectQueueSize: 0,
     destroyed: false,
     bytesRead: 765,
     bytesWritten: 408,
     allowHalfOpen: true,
     writable: true,
     readable: true,
     server: 
      { connections: 1,
        allowHalfOpen: true,
        _handle: [Object],
        _events: [Object],
        httpAllowHalfOpen: false },
     ondrain: [Function],
     _idleTimeout: 120000,
     _idleNext: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idlePrev: 
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        ontimeout: [Function] },
     _idleStart: Wed, 06 Jun 2012 10:30:41 GMT,
     _events: { timeout: [Function], error: [Function], close: [Object] },
     ondata: [Function],
     onend: [Function],
     _httpMessage: null },
  httpVersionMajor: 1,
  httpVersionMinor: 1,
  upgrade: false }

長いな。

ということはサンプルを少し変えて‥‥

var ht = require('http');
ht.createServer(function (req, response){
  response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'});
  response.end('<html><body><h1>Hello <span style="color:#c99;">Node.js</span></h1></body></html>\n');
  console.log(req['headers']['user-agent']);
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
star@sssx /z/home
$ node nd0606-04.js
Server running at http://127.0.0.1:8124/  ここでブラウザでこれを開く
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko)  Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11
Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko)  Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11


ふむ。なんで2回でるんだろ。

star@sssx /z/home
$ node nd0606-04.js
Server running at http://127.0.0.1:8124/
req.method=GET
req.url=/?your_name=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF
req.method=GET
req.url=/favicon.ico

2回目のrequestはfavicon.icoを自動的にrequestしていたらしい。
そのスクリプトはこちら。

var ht = require('http');
ht.createServer(function (req, response){
  response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'});
  response.end('<html><body><h1>Hello <span style="color:#c99;">Node.js</span></h1><form method="get"><input type="text" name="your_name" value="こんにちは" size="15"/><input type="submit" value="click!"/></form></body></html>\n');
  console.log('req.method=' + req.method);
  console.log('req.url=' + req.url);
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');

GETのときはreqに出てくるけど、POSTのときはreqに出てこない。