保持连接打开?

时间:2014-05-16 14:28:34

标签: node.js postgresql express

我正在使用节点js,express和postgresql作为后端。 这是我用来制作rest 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

我是否需要以某种方式关闭每个请求?在快递文档中找不到任何相关内容。什么可能是错的?

此错误仅发生在生产服务器上。不是在开发机器上。

更新 该应用程序仅在一个“模块”中制动。应用程序的其余部分工作正常。所以只有一些查询会产生错误。

1 个答案:

答案 0 :(得分: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.initialize放在app.useapp.VERB内,则会针对每个请求重复调用它,因此您最终会多次连接到PG。

对于大多数情况,您不需要为每个HTTP请求执行open + query + close。