在node.js中使用pg-postgres的正确方法?

时间:2016-05-07 01:51:20

标签: node.js postgresql

我是node.js的pg-postgres的新手。我试图找出正确的查询方式。现在我有这个

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

然后在我的每个http请求路由中,我都有这种代码:

var query = client.query(sql);
query.on('row', function(row, result) {
    result.addRow(row);
});
query.on('end', function(data) { 
    if (data.rows[0].count === '1') {
        return callback();
    }
    return failedCallback(req, res);
});

这是这样做的吗?或者我应该在每个http路由处理程序

中执行此操作
pg.connect(conString, function(err, client) {
  // Use the client to do things here
  client.end();
});

我还需要以这种方式结束每个http路由处理程序中的客户端吗?

1 个答案:

答案 0 :(得分:0)

选择事项:

这是一个选择问题。第一个允许您在其他函数中重用已声明的客户端,而第二个客户端在您的pg.connect内。我不认为你可以说一个是正确的而另一个不是。我可以将问题改为"更好的是:c.query(sql, function (err, result) {query.on('end', function(data) {"。

关于client.end()

如果您在每个http路由处理程序中结束连接,则除非再次client.connect();,否则您将无法重用客户端。这并不意味着你根本不必关闭它。我认为将客户端终止绑定到response.send()是合理的。如果你没有关闭与postgres的联系,你将很快到达max_connections。再次 - 您可能会使用连接池而不是直接连接到pg,但这并不意味着您应该无休止地生成新的和新的连接。

两者的例子:

//https://github.com/brianc/node-postgres
var pg = require('pg');
var conString = 'postgres://n@10.1.10.199/b';
var sql = 'SELECT substr(extract(epoch from now())::text,10,4) sec, $1::int client,pg_backend_pid() pid,count(*) from pg_stat_activity where usename = current_user group by client';

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

var query = client.query(sql,[1]);
query.on('end', function(data) { 
  console.log(data.rows);
});
var query = client.query(sql,[1]);
query.on('end', function(data) { 
  console.log(data.rows);
  //client.end();
});

var to = setTimeout(  //we start new client with small timeout to see one session with previous client
  function() {
    pg.connect(conString, function(err, c) {
        // execute a query on our database
        c.query('select pg_sleep(0.6);', function (err, result) {
        });
        c.query(sql,[2], function (err, result) {
          if (err) throw err;
          console.log(result.rows);
        });
        c.query(sql,[4], function (err, result) {
          console.log(result.rows);
        });
        //c.end();
        to;
    });
  }
  , 500
);

var to = setTimeout(
  function() {
    var query = client.query(sql,[3]);
    query.on('end', function(data) { 
      console.log(data.rows);
      //client.end();
    });
  }
  , 1000
);

生成:

...js>node 1.js
[ { sec: '2.31', client: 1, pid: 23327, count: '1' } ]
[ { sec: '2.32', client: 1, pid: 23327, count: '1' } ]
[ { sec: '3.29', client: 3, pid: 23327, count: '2' } ]
[ { sec: '3.41', client: 2, pid: 23328, count: '2' } ]
[ { sec: '3.42', client: 4, pid: 23328, count: '2' } ]

如您所见,客户端1和客户端3共享相同的pid,尽管在不同的函数中调用,因为声明了全局var client。对于2和4相同,在一个pg.connect中称为async共享一个pid。

现在,您应该将代码放入c.query(sql, function (err, result) {query.on('end', function(data) {,具体取决于您希望实现的目标。