管理node-postgres查询

时间:2013-07-31 08:40:11

标签: javascript node.js asynchronous connection-pooling

我已经阅读了node-postgres的API文档。

它建议我们使用pg对象来创建池化客户端。在pg.connect api文档中说:

  

connect方法从客户端池中检索客户端,或者全部检索客户端   池化客户端很忙,池没有满,连接方法   将创建一个新客户端将其第一个参数直接传递给   客户端构造函数。

所以根据建议,使用pg.connect是否意味着“使用pg对象来创建池化客户端”?如果不是,它究竟意味着什么?

在我的实现示例中,我在我的路线中提出了几个问题:

app.get('/post', function(req, res) {
  pg.connect(dbconfig, function(err, client, done) {
    client.query('SELECT * FROM post', function(err, result) {
      res.render('post/list', { posts: result.rows });
    });
  });
});

app.get('/post/new', function(req, res) {
  res.render('post/new');
});

app.post('/api/v1/post', function(req, res) {
  var b = req.body;
  pg.connect(dbconfig, function(err, client, done) {
    client.query('INSERT INTO post (title, content) VALUES ($1, $2)', 
      [b.title, b.content], 
      function(err, result) {
        done();
        res.redirect('/post');
    });
  });
});

每次我想查询时,是否是调用pg.connect的正确方法?如果没有,有什么更好的主意?

2 个答案:

答案 0 :(得分:0)

根据pg.connect()确实处理池连接的文档,看起来确实如此。不过我建议你做一件事可能会做得更好(假设你的应用只使用了一套凭据)。

如果我正在考虑这样做,我会努力保存重复的工作/击键/错误机会,并考虑将pg.connect()包装在某些你可以使用它会返回客户端的函数中。这将使您能够执行更多类似的操作:

app.get('/post', function(req, res) {
  db.run( function(client) {
    client.query('SELECT * FROM post', function(err, result) {
      res.render('post/list', { posts: result.rows });
    });
  });
});

然而,考虑到你完成任务的方式,我不相信你通过这种方法可以获得很多好处,所以我认为你的方法没有任何问题。

答案 1 :(得分:0)

现在这可能有点过时,但请看一下: https://github.com/aichholzer/Bodega

它将解决任何烦恼,让您的编码体验更愉快。 :)