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});
素人質問で申し訳ありませんが、よろしくお願い致します。
あなたの回答
tips
プレビュー