0
Help us understand the problem. What are the problem?

posted at

updated at

Heroku Postgresとアプリの接続設定

目次

1. herokuにデプロイした際の接続情報を設定
2. ローカルテスト時の接続情報を設定
3. DB接続のマネージャークラスを作成する
4. node.jsでの記述

1. herokuにデプロイした際の接続情報を設定

環境変数を管理する.envファイル追加する(アプリ作成フォルダに.envファイルを作成)
※ホスト名等はHerokuにログインしてアプリページからpostgresDBのページを開き、Database Credentialsのviewボタンをクリックして確認する

.env
ENV_HOST = [ホスト名]
ENV_DB = [DB名]
ENV_USER = [ユーザー名]
ENV_PASS = [パスワード]

dotenvモジュールをインストールする

$ npm install dotenv

アプリフォルダに新たにdbフォルダを作成し、db.jsファイルを配置する

/db/db.js
const pg = require('pg');
require('pg').defaults.ssl = true;
require('dotenv').config();

exports.pool = new pg.Pool ({
  host: process.env.ENV_HOST,
  database: process.env.ENV_DB,
  user: process.env.ENV_USER,
  port: 5432,
  password: process.env.ENV_PASS,
  ssl: { rejectUnauthorized: false }
});

node.jsでpostgresqlを使うためにpg(node-postgres)をインストール

$ npm install pg

2. ローカルテスト時の接続情報を設定

git bushを起動、アプリ作成フォルダにて下記コマンドを実行して接続情報をセットする

$ heroku config:set ENV_HOST=[ホスト名] --app [アプリ名]
$ heroku config:set ENV_DB=[DB名] --app [アプリ名]」
$ heroku config:set ENV_USER=[ユーザー名] --app [アプリ名]」
$ heroku config:set ENV_PASS=[パスワード] --app [アプリ名]」

3. DB接続のマネージャークラスを作成する

dbフォルダの下にpostgresManager.jsを配置する

/db/postgresManager.js
const db = require('../db/db');

/* Postgresクラス */
class PostgresManager {

    /**
     * Poolからclientを取得
     * @return {Promise<void>}
     */
    async init() {
        this.client = await db.pool.connect();
    }

    /**
     * SQLを実行
     * @param query
     * @param params
     * @return {Promise<*>}
     */
    async execute(query, params = []) {
        return (await this.client.query(query, params));
    }

    /**
     * 取得したクライアントを解放してPoolに戻す
     * @return {Promise<void>}
     */
    async release() {
        await this.client.release(true);
    }

    /**
     * Transaction Begin
     * @return {Promise<void>}
     */
    async begin() {
        await this.client.query('BEGIN');
    }

    /**
     * Transaction Commit
     * @return {Promise<void>}
     */
    async commit() {
        await this.client.query('COMMIT');
    }

    /**
     * Transaction Rollback
     * @return {Promise<void>}
     */
    async rollback() {
        await this.client.query('ROLLBACK');
    }
}

/**
 * Postgresのインスタンスを返却
 * @return {Promise<Postgres>}
 */
const getClient = async () => {
    const postgres = new PostgresManager();
    await postgres.init();
    return postgres;
};

module.exports.getPostgresClient = getClient;

4. node.jsでの記述

記述サンプル

const { getPostgresClient } = require('../db/postgresManager');

/* 検索処理 */
async function select_list(params) {

  var result;
  const dbm = await getPostgresClient();
  const sql = 'SELECT * FROM TEST';
  try {
    result = await dbm.execute(sql, params);
  } catch (e) {
    console.log('err:'+e.stack);
  } finally {
    console.log('success');
  }
}

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?