小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


node.js + PostgreSQLで普通のCRUDアプリを作ってみたよ。

はじめに

このエントリでは、node-postgresというPostgreSQL用の連携ライブラリを使い、node.jsとPostgreSQLを連携させたCRUD(Create,READ,UPDETE,DELETE)ができるサンプルアプリケーションを作る手順について書いています。

サーバサイドJavaScript Node.js入門
清水俊博 大津繁樹 Jxck 小林秀和 佐々木庸平 篠崎祐輔 高木敦也 西山雄也
アスキー・メディアワークス
売り上げランキング: 55,844

OSとソフトウェアのバージョン
  • Ubuntu10.10
  • PostgreSQL 8.4
  • node.js 0.4.8
  • node-postgres 0.5.0*1
事前準備

1. UbuntuにPostgreSQLをインストールします。
2. 以下のコマンドを実行して、node-postgresのインストールに必要なライブラリをインストールします。

sudo apt-get install libpq-dev

3.以下の構造のテーブルを作成します。

CREATE TABLE test
(
  id serial NOT NULL,
  "name" character(50),
  CONSTRAINT test_pkey PRIMARY KEY (id)
)
node-postgresのインストール

はじめに、node.jsのパッケージ管理システムであるnpmをインストールします。

続いて、npmコマンドでnode-postgresをインストールします。

sudo npm install pg -g
node-postgresの使い方

node-postgresの読み込みは、通常のライブラリ同様require関数で読み込みます。

var pg = require('pg');

PostgreSQLへの接続は以下のように書きます。第二引数には接続したときに実行されるコールバック関数を指定します。

var connectionString = "tcp://ユーザID:パスワード@localhost:5432/データベース名";
pg.connect(connectionString, function(error, client) {
  // 接続したときの処理
});

データベースからデータを取得する際には、client.query関数を使ってSQLを実行します。このとき、query.on('error'でエラーをハンドリングしてやるとエラー処理をすることができます。

var rows = [];
var query = client.query('SELECT * FROM test');
// エラーをキャッチした場合の処理
query.on('error', function(error) {
  console.log("error event stat...");
  errorMsg = sys.inspect(error);
  console.log(errorMsg);
  res.render('index', {
    title: title,
    data: rows,
    message: errorMsg
  });
});
// 1行取得した際の処理
query.on('row', function(row) {
  console.log("row event start...");
  rows.push(row);
});
// 最後の行に到達したときの処理
query.on('end', function(row, error) {
  console.log("end event start...");
  // エラーがなければ画面を表示する
  if(!errorMsg) {
    res.render('index', {
      title: title,
      data: rows,
      message: errorMsg
    });
  }
});

query.on('row', function(row) はselectにヒットした行が存在したときにコールされます。query.on('end', function(row) は最後の行になったときにコールされます。以下の例では、selectの結果を配列にpushしていき、最後の行に到達したときに、画面に表示しています。

新規登録や更新なども同様にclient.query関数を使います。

var query;
switch(action) {
  // 新規登録
  case "create":
    query = client.query('INSERT INTO test(name) VALUES($1)', [req.body.text]);
    break;
  // 更新
  case "update":
    query = client.query('UPDATE test SET NAME = $1 WHERE ID = $2', [req.body.text, req.body.selected]);
    break;
  // 削除
  case "delete":
    query = client.query('DELETE FROM test WHERE ID = $1', [req.body.selected]);
    break;
}
コールバック関数

node-postgresのドキュメントに書いてあるサンプルプログラムでは、コールバック関数を多用していますが、僕が作ったサンプルプログラムではコールバック関数をほとんど使用していません。理由は、コールバック関数を使うと思ったようにプログラムを組むことができなかったからです。
具体的には、クエリを実行して、コールバックで画面描画するようにプログラムした際に、クエリの実行を待たずに画面描画が走り、画面上と実際のDB上のデータが一致しない状態になることがありました。この問題に関しては、後日調査したいと思っています。

サンプルプログラム

サンプルプログラムをGitHubに置いておきます。

Gitをインストールをした状態で、以下のコマンドでソースコードをリポジトリから取得することができます。

git clone https://replication@github.com/replication/nodePostgreSample.git

サンプルアプリケーションの起動は、以下のコマンドで行います。

node app.js
トラブルシューティング
  • npm install pgしたら、error: The program ['pg_config'] is requiredのエラーになる

以下のコマンドを実行して、ライブラリをインストールしてください。

sudo apt-get install libpq-dev