はじめに
DB からのデータ取得などの動作を含む簡単な Web アプリを試したい。PoC レベルでバックエンド側の API 作成まで行うのは時間がかかりすぎるため、本記事では TypeScript から PostgreSQL に接続し、データ取得を行う。また PostgreSQL 環境自体も容易に作成・破棄できるよう Docker コンテナ上に構築している。詳細は Dockerコンテナ上のPostgreSQLにデータベースを作成を参照。実行環境は以下。
- Windows 10 Pro (WSL2: Ubuntu-20.04)
- pg 6.14.15
- @types/pg 6.14.15
公式ドキュメントを参考にした。
ライブラリのインストール
まず PostgreSQL に接続するためのライブラリ pg
をインストールする。今回は TypeScript で扱いたいので、合わせて型定義 @types/pg
もインストールしておく。
$ npm install pg
$ npm install @types/pg
DB 接続プログラム
続いて、pg を用いて DB に接続する。公式ドキュメントを参考に作成したプログラムは以下。Client 内の設定は Dockerコンテナ上のPostgreSQLにデータベースを作成と同様のものとしている。
const { Client } = require('pg');
const client = new Client({
user: 'postgres',
password: 'postgres',
host: '[host address]', // 詳細は後述
database: 'test_db',
port: 5432
});
client.connect();
console.log('connected')
client
.query('select now()')
.then((res: any) => console.log(res.rows))
.catch((err: any) => console.error('connection error', err.stack))
.then(() => client.end())
.then(() => console.log('disconnected'));
ここで host
は Docker コンテナにアクセスすることで確認できる。
$ docker exec -it [container id] /bin/bash
root:/# hostname -i
たとえばこの際に 172.17.0.2
が得られたとする。しかし、このアドレスをそのまま指定しても接続することはできなかった。詳細は理解できていないが、172.17.0.1
のように同じネットワークアドレスかつホストアドレスが 1
のアドレスを指定するとアクセスできた。デフォルトゲートウェイ(?)が原因のようだが、わかっていないので詳しい方がいたらぜひ教えて下さい。
上記 ts ファイルをトランスパイルして、実行すると以下のような出力が得られる。
$ tsc dbOpe.ts && node dbOpe.js
connected
[ { now: 2021-09-10T05:03:25.955Z } ]
disconnected
DB にアクセスし、データ取得できたことが確認できる。
おわりに
pg ライブラリを使用して、DB に接続した。API なしでフロントエンドから直接 DB を参照できるかと考えたが、こちらによると pg は Node.js でしか実行できないようだ。PoC レベルでもフロントエンドと DB を接続するには Web API を作成するしかないか。