2014-05-16 140 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