Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在服务器中使用节点postgres?_Node.js_Node Postgres - Fatal编程技术网

Node.js 如何在服务器中使用节点postgres?

Node.js 如何在服务器中使用节点postgres?,node.js,node-postgres,Node.js,Node Postgres,我正在编写一个Node.js web服务器,它使用Postgres数据库。我以前每次接到新请求时都会这样连接: app.get('/', function (req, res) { pg.connect(pgconnstring, function (err, client) { // ... }); }); 但在几次请求之后,我注意到Heroku在尝试连接时出现了“内存不足”错误。我的数据库只有10行,所以我不知道这是怎么发生的。我的所有数据库访问均采用以下形式: clien

我正在编写一个Node.js web服务器,它使用Postgres数据库。我以前每次接到新请求时都会这样连接:

app.get('/', function (req, res) {
  pg.connect(pgconnstring, function (err, client) {
    // ...
  });
});
但在几次请求之后,我注意到Heroku在尝试连接时出现了“内存不足”错误。我的数据库只有10行,所以我不知道这是怎么发生的。我的所有数据库访问均采用以下形式:

client.query('SELECT * FROM table', function (err, result) {
  if (err) {
    res.send(500, 'database error');
    return;
  }

  res.set('Content-Type', 'application/json');
  res.send(JSON.stringify({ data: result.rows.map(makeJSON) }));
});
假设内存错误是由于有多个到数据库的持久连接造成的,我切换到了我在几个
节点postgre中看到的一种样式,即在文件顶部只连接一次:

var client = new pg.Client(pgconnstring);
client.connect();

app.get('/', function (req, res) {
  // ...
});
但是现在,当我在连接中断后尝试执行查询时,我的请求会挂起(无限期?)。(我通过杀死一台Postgres服务器并将其重新启动来模拟它。)

那我该怎么做呢

  • 正确地共享Postgres连接,这样我每次都可以“重新连接”,而不会耗尽内存
  • 使全局客户端在网络故障后自动重新连接

  • 我假设您使用的是node postgres的最新版本,其中连接池得到了极大的改进。现在必须将连接重新检查回池中,否则会使连接放气:

    app.get('/', function (req, res) {
      pg.connect(pgconnstring, function (err, client, done) {
        // do some stuff
        done();
      });
    });
    
    至于全局连接上的错误处理(#2,但我会使用池):

    所有这些的“缺失”文档都在屏幕上

    client.on('error', function(e){
      client.connect(); // would check the error, etc in a production app
    });