2017-10-08 17 views
0

データベースに接続してクエリを実行するために使用するpostgresヘルパーを作成しました。コード:NodeJS Postgresヘルパー - リリース接続

var pg = require('pg'); 
 
var dbConn = require('../config.json').dbConn; 
 
var pool = new pg.Pool(dbConn); 
 

 
var status = { 
 
    "OK": 0, 
 
    "ERROR": 1 
 
}; 
 
var message = { 
 
    "success": "success", 
 
    "error": "error", 
 
    "databaseError": "Database error" 
 
}; 
 

 
var helper = { 
 
    query: function (query, params, success, error) { 
 
     pool.connect(function (err, client, done) { 
 
      if (err) { 
 
       error({ 
 
        status: status.ERROR, 
 
        message: message.databaseError, 
 
        data: err 
 
       }); 
 
       return; 
 
      } 
 
      client.query(query, params, function (err, result) { 
 
       //call `done()` to release the client back to the pool 
 
       done(); 
 

 
       if (err) { 
 
        error({ 
 
         status: status.ERROR, 
 
         message: message.databaseError, 
 
         data: err 
 
        }); 
 
        return; 
 
       } 
 
       success({ 
 
        status: status.OK, 
 
        message: message.success, 
 
        result: result 
 
       }); 
 
      }); 
 
     }); 
 
    } 
 
}; 
 

 
module.exports = helper;

それが実行されたクエリの後に接続を解除するロジックを持っていません。だからしばらくして、データベースのエラーが発生します。「クライアントが多すぎます...」 誰かに私にその方法を教えてもらえますか?一度私はclose()やrelease()関数を呼び出す)しようとしましたが、接続が壊れてしまい、アプリケーションを再起動するまで新しいリクエストを作成できませんでした。

+0

:あなたはトランザクションを使用している場合、あなたはおそらく、あなたが何をしたいのほとんどの世話をするpool.queryの便利なメソッドをご覧ください-promise](https://github.com/vitaly-t/pg-promise);) –

答えて

0

あなたがこれをやっているやり方では、あなたはプールを利用せず、あなたのヘルパーを使うたびにプールを作ります。 [PGをチェックアウトし、完全な接続の問題を避けるために

const { Pool } = require('pg') 

const pool = new Pool() 

pool.query('SELECT * FROM users WHERE id = $1', [1], (err, res) => { 
    if (err) { 
    throw err 
    } 

    console.log('user:', res.rows[0]) 
}) 

https://node-postgres.com/features/pooling#single-query