LoginSignup
35
36

More than 3 years have passed since last update.

【Node.js+Express+PostgreSQL】ExpressにPostgreSQLを導入

Last updated at Posted at 2019-06-12

背景

DBに接続するWebアプリケーション開発をしたい。
使い慣れているExpressと、最終的にHerokuで公開することを考慮してPostgreSQLを使いたい。
なお、自分用のメモみたいな感じで書いているので、その点はご了承いただきたい。

環境

  • Windows 10
  • Express 4.16.0
  • PostgreSQL 11.3
  • pg 7.11.0

PostgreSQLのインストール

「PostgreSQL インストール」でググると、方法が出てくるのでそれらを参考にしてください。

サンプル用のデータベース用意

  1. mydbというデータベースを作成。
command
psql -U postgres mydb
パスワード: 

パスワードは、PostgreSQLインストール時に指定したものを入力。
入力時、何も入力されていないように見えるが、正しいパスワードを入力してEnterキーを押せば、データベースに接続できる。

-
2. staffテーブルの作成。

command
CREATE TABLE Staff (
id    CHAR(4)    NOT NULL,
name   TEXT       NOT NULL,
age    INTEGER    ,
PRIMARY KEY (id));

-
3. staffテーブルに適当にレコード作成

command
INSERT INTO staff VALUES (1, 'taro', 21), (2, 'Jiro', 20), (3, 'Saburo', 18);

-
4. レコードが作成できたか一応確認

command
SELECT * FROM staff;

アプリケーションの作成

  1. 適当に名前をつけてExpressアプリケーションを作成。
command
express -e practice_postgres
cd practice_postgres
npm install

-
2. 今回必要なモジュールnode-postgresのインストール。

command
npm install pg --save

-
3. クライアント側の記述

index.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <p><%= datas %></p>
  </body>
</html>

-
4. サーバ側の記述

index.js
var express = require('express');
var router = express.Router();
var pg = require('pg');

router.get('/', function(req, res, next) {
  var pool = pg.Pool({
    database: 'mydb',
    user: 'postgres', //ユーザー名はデフォルト以外を利用している人は適宜変更してください。
    password: 'PASSWORD', //PASSWORDにはPostgreSQLをインストールした際に設定したパスワードを記述。
    host: 'localhost',
    port: 5432,
  });
  pool.connect( function(err, client) {
    if (err) {
      console.log(err);
    } else {
      client.query('SELECT name FROM staff', function (err, result) {
        res.render('index', {
          title: 'Express',
          datas: result.rows[0].name,
        });
        console.log(result); //コンソール上での確認用なため、この1文は必須ではない。
      });
    }
  });
});

module.exports = router;

ここでは、わかりやすくするために、datas: result.rows[0].name,の部分で{id: 1, name: 'taro', age: 21}からTaroを取得してクライアントで表示するようにしている。

-
5. 実行結果確認
上記のコードを記述したら、表示確認。

command
npm start

20190611a.PNG
上記のように表示されていれば成功。

あとがき

PostgreSQLに関する知識がない状態から、メモ代わりに本記事を書いた。
とりあえず、ExpressからPostgreSQLに接続する必要最低限のことはできたので、今後はHeroku Postgresを使ってHeroku上でアプリケーションを公開する方法などを模索していく。
ご指摘などあれば、コメントによろしくお願いします。

追記

Heroku Postgresに接続する際は、Heroku Postgresにテーブルとレコードを作成した後、以下のコードのdatabaseなどの情報をHeroku上に載っているもの(※)に書き換える。
※herokuのアプリ>Resources>Heroku Postgres>Settings、から閲覧可能。

index.js
var pool = pg.Pool({
    database: 'mydb',
    user: 'postgres', //ユーザー名はデフォルト以外を利用している人は適宜変更してください。
    password: 'PASSWORD', //PASSWORDにはPostgreSQLをインストールした際に設定したパスワードを記述。
    host: 'localhost',
    port: 5432,
  });

また、host: localhostのままだと、エラー吐かれる。

追記2

Heroku Postgresへの接続は、こちらの記事で詳しくまとめた。

追記3

async/await使うパターンは、こちらの記事でまとめた。

追記4

SQLのトランザクションを考慮したコードを、こちらの記事でまとめた。
この記事のコードは汎用性の高いもの、などと勝手に思っている。

参考文献

35
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
36