0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Heroku Postgresとアプリの接続設定

Last updated at Posted at 2022-08-01

目次

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');
  }
}
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?