2017-10-08 225 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

要避免連接問題乾脆,檢查出[PG -promise](https://github.com/vitaly-t/pg-promise);) –

回答

0

你這樣做的方式,你沒有充分利用池,而是每次使用助手時都會創建池。如果您正在使用事務,你應該看看會照顧大多數的pool.query便捷的方法你想要什麼:

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