質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

0回答

970閲覧

HerokuでNode.js+PostgresSQLでタイムアウト(エラーコード:H12)が周期的に発生する

Lizard_Nest

総合スコア9

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2021/06/06 14:06

Herokuの無料版の環境でNode.js+PostgresSQLでチャットの様なものを作ろうとしました。形としては完成したのですが、数回ページをリロードするとタイムアウトエラーが発生します。heroku logsコマンドで確認したところ

Heroku

1at=error code=H12 desc="Request timeout" method=GET path="/" ~略~

といったようなエラーメッセージでした。pgモジュールを使用して、Poolインスタンスを作成し、PostgresSQLと接続しました。このPostgresSQLと接続する前の状態では、何度ページをリロードしてもタイムアウトエラーが起こることはありませんでした。しかし、PostgresSQLと接続するために、コードを書くと、最初5~6回のリロードは正常にデータベースとの通信が行われ、ページは読み込まれたのですが、その後タイムアウトエラーとなってしまいます。これはリロードの間隔が短すぎるということでもなく、5分毎に1回自動的にリロードするように設定すると30分程度でタイムアウトエラーが発生していたので、回数の問題かと思われます。下記が該当部分のコードです。

app.js

1const {Pool} = require('pg'); 2const psql = new Pool({ 3 user: '略', 4 host: '略', 5 database: '略', 6 password: '略', 7 port: 5432, 8 ssl:{ 9 sslmode: 'require', 10 rejectUnauthorized: false 11 } 12}); 13const app = express(); 14app.set("view engine", "ejs"); 15app.get("/", function (req, res) { 16 var query = { 17 text: 'select * from data', 18 values: [], 19 }; 20//-------------問題だと思われる部分---------------- 21 psql.connect().then(psql_res => { 22 psql.query(query).then(query_res => { 23 console.log(query_res.rows) 24 var data = {all : query_res.rows} 25 res.render("./index.ejs", data); 26 }).catch(e => console.error(e.stack)) 27 }).catch(e => console.error(e.stack)) 28//-------------ここまで---------------- 29});

自分が考えたのはデータベースに過度にアクセスがかかると制限がかかるのかと思い、非同期処理などについて色々調べましたが、何が問題なのかよく分かりませんでした。connectしたあとにthenでqueryを飛ばし、受け取ったdataをrenderしているという流れだと解釈しています。また、catchにより接続やクエリが失敗した時の対応も出来ています。

ここまで自分が悩んだ問題点を書きました。最終的には自分で公式ドキュメントのミドルウェアを参考にすることで解決出来ました。しかし、上のコードと何が違って、何がいけなかったのか分からないので、問題点を指摘して頂けたら幸いです。修正して、正常に動作するようになったコードは下記です。

app.js

1const {Pool} = require('pg'); 2const psql = new Pool({ 3 user: '略', 4 host: '略', 5 database: '略', 6 password: '略', 7 port: 5432, 8 ssl:{ 9 sslmode: 'require', 10 rejectUnauthorized: false 11 } 12}); 13const app = express(); 14app.set("view engine", "ejs"); 15app.get("/", function (req, res) { 16 var query = { 17 text: 'select * from data', 18 values: [], 19 }; 20//-------------修正した部分---------------- 21 psql.connect((err, client, release) => { 22 if (err) { 23 return console.error('Error acquiring client', err.stack) 24 } 25 client.query(query, (err, result) => { 26 release() 27 if (err) { 28 return console.error('Error executing query', err.stack) 29 } 30 console.log(result.rows) 31 var data = {all : result.rows} 32 res.render("./index.ejs", data); 33 }) 34 }) 35//-------------ここまで---------------- 36});

素人質問で申し訳ありませんが、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問