2014-05-16 137 views
2

我使用節點js,express和postgresql作爲後端。 這是我用來做休息API的方法:快速保持連接打開?

exports.schema = function (inputs, res) { 
    var query = knex('schema') 
    .orderBy('sch_title', 'asc') 
    .select(); 

    query.exec(function (err, schemas) { 
    if(err){ 
     var response = { 
     message: 'Something went wrong when trying to fetch schemas', 
     thrownErr: err 
     }; 
     console.error(response); 
     res.send(500, response); 
    } 
    if(schemas.length === 0){ 
     var message = 'No schemas was found'; 
     console.error(message); 
     res.send(400, message); 
     return; 
    } 
    res.send(200, schemas); 
    }); 
}; 

它的工作原理,但一段時間Postgres的後記錄一個錯誤,它不再工作:

sorry, too man clients already 

我需要密切每個請求不知何故?在快速文檔中找不到任何關於此的信息。什麼可能是錯誤的?

此錯誤僅在生產服務器上發生。不在開發機器上。

更新 該應用只在一個「模塊」中剎車。該應用程序的其餘部分工作正常。所以只有一些查詢會給出錯誤。

+0

看起來像完成查詢時db連接不關閉。而不是表達。 – jmingov

+0

http://stackoverflow.com/questions/2757549/org-postgresql-util-psqlexception-fatal-sorry-too-many-clients-已經有用了嗎? –

+0

這絕對是您的postgres問題,而不是快遞。你能發佈DB代碼的相關部分嗎? – jeremy

回答

5

只需保持一個連接爲您的整個應用程序打開。 docs shows an example如何做到這一點。

此代碼放在你的app.js ...

var Knex = require('knex'); 
Knex.knex = Knex.initialize({ 
    client: 'pg', 
    connection: { 
    // your connection config 
    } 
}); 

而當你想在你的控制器/中間件查詢......

var knex = require('knex').knex; 

exports.schema = function (req, res) { 
    var query = knex('schema') 
     .orderBy('sch_title', 'asc') 
     .select(); 
    // more code... 
}; 

如果你把Knex.initializeapp.useapp.VERB內,它會被每次請求重複調用,因此您最終會多次連接到PG。

對於大多數情況,您不需要爲每個HTTP請求執行open + query + close。

+0

在這種情況下,你會建議在哪裏做一個knex.destroy()?或者,如果服務器出現故障,連接可能會被破壞? –

+0

連接只會過期,但如果您想要更優雅的解決方案,則可以使用Node.JS進程監聽SIGTERM事件。像這樣的:https://gist.github.com/hyubs/2dbc0265b8079948c92b – hyubs