kkana's blog

新米コーダーの忘れそうなことメモ

node.jsでサーバーを起動する・POSTリクエストのデータを取得してみる

普段gulpを使うために触るくらいしか(それもかなり簡単なことしか・・)使ったことがないnode.js。
サーバーを起動できるときいたのでやってみました。

サーバーのこともnode.jsもよくわかってない状態なので間違ってる記述があるかもしれないです・・・

正直、言われたように書いたら言われた通りに動いた、というだけなんですが ここではじめてnode.jsではモジュールを使う(機能ごとにファイルが分割されていて、それを別のファイルから呼び出して利用できる)ことがわかったので 、それだけで触ってみてよかったです。

require関数とexportsオブジェクト

機能のほうのjsファイルではexportsオブジェクトを使う。 exportsオブジェクトのプロパティがモジュールの機能になる。 例えば、ArrayUtils.jsというのを作って

//配列の最小値を返す
exports.min = function(arr) {
  return Math.min.apply(null, arr);
};

呼び出すほうのファイルでは、以下のようにrequireを使って呼び出す。
require関数は指定したファイルを読み込んで、読み込んだファイルのexportsオブジェクトを返す関数。
引数にファイルパスを書く。ファイルパスには.jsはあってもなくても構わない。

var arrUtiils = require('./lib/ArrayUtils');

そうすると、呼び出すほうでarrUtiils.min()が使える!

さて、

node.jsでHTTPサーバーを起動してみる

以下を書いたjsを「node ファイル名」で実行するとサーバーが起動。 http://localhost:ポート番号/で確認できる

server.jsというファイルをつくる。

var http = require('http');

http.createServer(function(req, res) {
//ここに書いた内容がリクエストの度に呼ばれる
//reqはリクエストオブジェクト(req.urlではリクエストのURLを取得)
//resはレスポンスオブジェクト
});
//localhostのどのポートでサーバーを起動するか
server.listen(ポート番号);

res.endでレスポンスを書き込む、かつ レスポンスがここで終了であることをクライアントに伝える(接続がきれる)
基本的にはすべてのリクエストに対してres.endを呼び出すようにする(でないと読み込みが続く)
404を返すときはres.statusCode = 404;というように書く。


serve.jsと同じ階層にindex.htmlを作って、表示させる

fsモジュール(ファイルシステム)を使う。 できることは http://www.pxt.jp/ja/diary/article/268/ ここらへんを参考に・・

var http = require('http');
var fs = require('fs');

var server = http.createServer(function(req, res) {
    //GETリクエストだったら
    if (req.url === '/' && req.method === 'GET') {
        // serve.jsと同じ階層にあるindex.htmlを読み込む
        //(__dirnameは実行中のスクリプトがあるディレクトリの名前)
        fs.readFile(__dirname + '/index.html', {
            encoding: 'utf8'
        }, function(err, html) {
            // ファイルの読み込みに失敗したらエラーのレスポンス
            if (err) {
                res.statusCode = 500;
                res.end('Error!');
            }
            // ファイルの読み込みが成功したらHTMLをかえす
            else {
                res.setHeader('Content-Type', 'text/html');
                res.end(html);
            }
        });
    } else {//ルート以外のディレクトリだったらnotfoundと表示させる
        res.statusCode = 404;
        res.end('Not Found!!');
    }
});

// localhostの8000番ポートでサーバーを起動する
server.listen(8000);

POSTの処理

こういうフォームのあるhtmlを作って

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>POSTの処理</title>
</head>
<body>
<form method="POST" action="/postPage">
  <input type="text" name="hoge">
  <input type="submit" value="POST">
</form>
</body>
</html>

server.jsはこんな感じに

var http = require('http');
//ファイルシステムモジュール
var fs = require('fs');
//HTMLのフォームから渡ってくるようなデータをパースするとき使うモジュール
var querystring = require('querystring');

var server = http.createServer(function(req, res) {
    //server.jsと同じ階層で、GETリクエストだったら
    if (req.url === '/' && req.method === 'GET') {
        // index.htmlを読み込む
        fs.readFile(__dirname + '/index.html', {
            encoding: 'utf8'
        }, function(err, html) {
            // ファイルの読み込みに失敗したらエラーのレスポンスを返す
            if (err) {
                res.statusCode = 500;
                res.end('Error!');
            }
            // ファイルの読み込みが成功したらHTMLを返す
            else {
                res.setHeader('Content-Type', 'text/html');
                res.end(html);
            }
        });
    }
    //postPageで、POSTリクエストだったら
    else if (req.url === '/postPage' && req.method === 'POST') {
        var data = '';
        //readableイベントが発火したらデータにリクエストボディのデータを追加
        req.on('readable', function(chunk) {
            data += req.read();
        });
        //リクエストボディをすべて読み込んだらendイベントが発火する。
        req.on('end', function() {
            //パースする
            querystring.parse(data);
            res.end(data);
        });
    } else {
        res.statusCode = 404;
        res.end('Not Found!!');
    }
});

// localhostの8000番ポートでサーバーを起動する
server.listen(8000);

リクエストオブジェクトでreadableイベントが発火する(??)ので そこでreq.read()でデータを取得。 querystringモジュールを使ってquerystring.parse()でパースする。

index.htmlでフォームが表示され、postPageでフォームで入力した内容が表示されました。


メモ

ステータスコードを覚えてなかったので・・・

  • 100番台…リクエスト処理
  • 200番台…リクエスト受理
  • 300番台…追加処理(リダイレクト)
  • 400番台…クライアントエラー
  • 500番台…サーバーエラー

特によく見る
* 403 立ち入り禁止
* 404 Not Found
* 500 Internal Server Error
* 503 Service Unavailable