0

我遇到了一個奇怪的問題,我似乎無法得到正確的結果。Node.js pg池緩慢執行第二次執行

我在一個Node.js應用程序中使用pg池,它在第一次執行時非常快速地運行,然後在第二次運行時它顯着變慢(30/50secs)。

我通過它似乎需要爲了使用全局變量的不創建,我已經嘗試做如下多個池GitHub的頁面https://github.com/brianc/node-postgres/wiki/Example

上的文檔閱讀。

我有波紋管

var express = require("express"); 
var path = require("path"); 
var app = express(); 
var port = 3000; 

app.use("/public", express.static(process.cwd() + "/public")); 

app.set("views", process.cwd() + "/public/views"); 
app.set("view engine", "ejs"); 

var login_route = require("./public/logic/login/login_route.js"); 
app.use(login_route); 

app.listen(port, function() { 

    var message = "Server Started: Port " + port; 
    console.log(message); 

}); 

我的主服務器的文件,該文件正在使用的路由文件,該文件確實數據庫查詢

var express = require("express"); 
var router = express.Router(); 

var pg = require("pg"); 

var credentials = { 
    host: "127.0.0.1", 
    port: "5432", 
    database: "altaltalt", 
    user: "postgres", 
    password: "postgres", 
    max: 100, 
    idleTimeoutMillis: 30000 
}; 

var pool = new pg.Pool(credentials); 

// this bit of code is executed 
// when a button is clicked 
router.get("/exec", function(req, res) { 

    pool.connect (
     function(error, client, done) { 

     if(error) { 
      console.log("connection failed"); 
     } 

     client.query(

      "select * from dummytable", 
      function(error, result) { 

       done(); 

       if(error) { 
        console.log(error); 
       } 

       alert(result.rows); 

      } 

     ); 

     } 
    ); 

}); 

module.exports = router; 

當我做一個GET請求,則執行真的很快,一旦這條路線該按鈕被按下,但任何時候它被按下後,它變得非常緩慢。

我在代碼中丟失了什麼嗎?是否有額外的步驟來處理多個請求?

+2

在過去,我有類似的問題,我使用這個庫(節點的Postgres)瘋了。然後我發現[pg-promise] [1],它爲您完成關閉客戶的所有工作,並且基於承諾。我的生活改變了。 [1]:http://github.com/vitaly-t/pg-promise –

+0

這聽起來真的很好,我一定會看看它 – Trent

+2

@Trent搬進[pg-promise](https:/ /github.com/vitaly-t/pg-promise)將會消除連接池及其管理帶來的所有問題。 –

回答

1

alert()在Node中不存在。另外,當你接受一個HTTP請求時,你應該發回一個響應。最後,如果你只想運行一個查詢,你可以使用pool.query()

一起:

router.get('/exec', function(req, res) { 
    pool.query('select * from dummytable', function(error, result) { 
    if (error) { 
     console.log('query failed'); 
     return res.sendStatus(500); 
    } 
    res.send(result.rows); 
    }); 
}); 

而且使用pool.connect()

router.get('/exec', function(req, res) { 
    pool.connect(function(error, client, done) { 
    if (error) { 
     console.log('connection failed'); 
     return res.sendStatus(500); 
    } 

    client.query('select * from dummytable', function(error, result) { 
     done(error); 
     if (error) { 
     console.log('query failed'); 
     return res.sendStatus(500); 
     } 
     res.send(result.rows); 
    }); 
    }); 
}); 
+0

Hello @robertklep,我正在使用node-webpack,這就是我使用警報的原因。此外,我不知道爲什麼,但只要我在最後添加了res.send(result.rows)位,它開始工作正常,不是100%確定爲什麼修復它 – Trent

+1

@Trent'alert()'是客戶端端(瀏覽器)代碼,但您的代碼旨在運行服務器端(節點)。 – robertklep

+0

我只使用警報進行調試,一旦錯誤得到修復,我就將其刪除 – Trent