情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

expressモジュールによるHTTPサーバ(1)サーバの作成と起動と停止

この記事は「expressモジュールによるHTTPサーバ」という連載記事の1つ目の記事です。

その他の記事に関しては下を参照してください。

この記事ではexpressモジュールを使ってHTTPサーバを作成し、起動し、停止する方法を説明します。

HTTPサーバの作成

expressモジュールでは1つのHTTPサーバを1つのアプリケーションと捉え、アプリケーションを構成することによりHTTPサーバを実装します。

そのため、expressモジュールでHTTPサーバを作成するにはまずexpressモジュールにおけるアプリケーションを作成しなければなりません。

アプリケーションを作成するにはexpress関数を使用します。

var express = require('express');

var app = express();

返り値としてアプリケーションを表すexpress.Applicationクラスのインスタンスが得られます。

このインスタンスはapp(applicationの省略)という名称の変数に格納されることが多いです。以後このインスタンスをappと表記します。

express関数の返り値として得られた時点でのアプリケーションは最低限の処理(エラー処理など)のみを行うようになっています。

そのため、様々な処理を行うようにアプリケーションを構成するにはこのインスタンスの設定を変更したり、処理を追加したりする必要があります。

アプリケーションの設定

expressモジュールではアプリケーションの設定は設定項目の集まりとして表され、設定項目は名称と値から成ります。

設定の取得

アプリケーションの設定を取得するにはapp.get関数を使用します。

var setting = app.get('xxx');

第1引数に設定項目の名称を指定します。

返り値として設定項目の値が得られます。

設定の取得(真偽値)

設定項目の値が真偽値である場合にはapp.get関数を使用する代わりにapp.enabled関数やapp.disabled関数を使用することもできます。

var enabled = app.enabled('xxx');
var disabled = app.disabled('xxx');

第1引数に設定項目の名称を指定します。

app.enabled関数の場合、設定項目の値がtrueである場合には返り値としてtrueが返り、falseである場合にはfalseが返ります。

app.disabled関数の場合、設定項目の値がtrueである場合には返り値としてfalseが返り、falseである場合にはtrueが返ります。

設定の変更

アプリケーションの設定を変更するにはapp.set関数を使用します。

app.set('xxx', 'yyy');

第1引数に設定項目の名称を指定します。

第2引数に設定項目の値を指定します。

設定の変更(真偽値)

設定項目の値が真偽値である場合にはapp.set関数を使用する代わりにapp.enable関数やapp.disable関数を使用することもできます。

app.enable('xxx');
app.disable('xxx');

app.enable('xxx')app.set('xxx', true)と同じであり、app.disable('xxx')app.set('xxx', false)と同じです。

設定項目

expressモジュールの内部で使用される設定項目としては様々なものがありますが、基本的にはデフォルトの設定のままで構いません。

ただし、下の設定項目に関しては値を変更するべきです。

  • env
  • x-powered-by

なお、expressモジュールの内部で使用されない設定項目であっても上の6つの関数を使用して自由に設定や取得を行うことができます

env

この設定項目は開発時と本番時のアプリケーションの動作を切り替えるためのものです。

開発時にはdevelopmentに設定し、本番時にはproductionに設定します

x-powered-by

この設定項目はHTTPレスポンスヘッダにX-Powered-By: Expressというフィールドを追加するかを真偽値として設定するものですが、セキュリティの観点からX-Powered-Byフィールドは使用するべきではありません。

この設定項目の値はデフォルトではtrueとなっているため、app.set関数かapp.disable関数を使用してfalseに変更します

HTTPサーバの起動

HTTPサーバを起動するには主に2つの方法があります。

expressモジュールの関数を使用する方法

app.listen関数を使用します。

var server = app.listen(3000, function () {
});

第1引数にポート番号を指定します。0を指定した場合にはランダムなポート番号が割り当てられます。

第2引数にコールバック関数を指定します。この引数は指定しなくても構いません。

返り値としてHTTPサーバを表すhttp.Serverクラスのインスタンスが得られます。以後このインスタンスをserverと表記します。

このインスタンスが表すHTTPサーバは返り値として得られた時点で既に起動しています。そのため、サーバの起動のためにserver.listen関数を呼び出す必要はありません

しかし、サーバを停止する処理やエラー処理などは必要です

http.Serverクラスのインスタンスの使用方法に関しては下の記事を参照してください。

httpモジュールの関数を使用する方法

http.createServer関数によりHTTPサーバを作成し、server.listen関数によりHTTPサーバを起動します。

http.createServer関数やserver.listen関数の使用方法に関しては下の記事を参照してください。

appexpressモジュールにおけるアプリケーションを表すだけでなくクライアントからのHTTPリクエストを処理する関数でもあります

そのため、http.createServer関数の第1引数として指定することができます

リクエストの処理

クライアントからのHTTPリクエストに対する処理を記述しなかった場合やHTTPリクエストに対する処理においてHTTPレスポンスを送信しなかった場合には自動的にステータスが404 Not FoundのHTTPレスポンスが送信されます

サンプルコード1

何もしないHTTPサーバを作成し、起動します。

Enterキーが押されたらサーバを停止し、プログラムを終了します。

express-server.js

var express = require('express');

var app = express();
app.set('env', 'development');
app.set('x-powered-by', false);
var server = app.listen(3000, function () {
    console.log('http server is running...press enter key to exit.');

    process.stdin.on('data', function (data) {
        if (data.indexOf('\n') !== -1) {
            server.close(function () {
                console.log('http server closed.');
                process.exit(0);
            });
        }
    });
});
server.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

  • express
    npm install expressでインストールします。

実行結果

実行結果の確認のためにcURLを使用しています。

コードを実行するとHTTPサーバが起動します。

C:\work\node>node express-server.js
http server is running...press enter key to exit.

cURLを使ってサーバに対してHTTPリクエストを行うと下のような結果になりました。

サーバから正しくレスポンスが返っていることが分かります。

C:\work\node>curl -v http://localhost:3000/
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET / HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< X-Content-Type-Options: nosniff
< Content-Type: text/html; charset=utf-8
< Content-Length: 13
< Date: Sat, 02 Jul 2016 09:39:30 GMT
< Connection: keep-alive
<
Cannot GET /
* Connection #0 to host localhost left intact

Enterキーを押すとサーバが停止し、プログラムが終了します。

C:\work\node>node express-server.js
http server is running...press enter key to exit.

http server closed.

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-express, Node.js