如何在NodeJS / Express服务器上使用Postgres池

时间:2019-03-28 19:19:28

标签: node.js postgresql express node-postgres

Postgres的新手和事务池的一般概念。在文档中,Postgres建议对单个查询使用pool.query方法,并警告“ You must always return the client to the pool if you successfully check it out”。我的意思是,您必须为客户端调用client.release()或为池调用pool.end()(如果我错了,请更正我)。因此,在我的Node / Express服务器中,我做了一个简单的测试:

const { Pool } = require('pg');
const pool = new Pool();

...

router.post('/test', async (req, res) => {
    let { username } = req.body;

    let dbRes;

    try{
        dbRes = await pool.query('SELECT * FROM users WHERE username = $1', [username]);
    } catch(err){
        let errMsg = "Error fetching user data: " + err;
        console.error(errMsg);
        return res.send({"actionSuccess": false, "error": errMsg});
    }

    //do something with dbRes, maybe do an update query;

    try{
        await pool.end();
    } catch(err){
        return "There was an error ending database pool: " + err.stack;
    }

    res.send({"dbRes": dbRes.rows[0]})
});

我运行服务器,使用邮递员对此/test路由进行邮寄呼叫,一切正常。但是,如果我再次拨打相同的电话,这一次我将收到错误Error: Cannot use a pool after calling end on the pool。这是有道理的,我在此请求内终止了池,但同时没有任何意义。我猜池/客户端不像我最初想象的那样绑定到单个服务器请求,这意味着,如果对节点服务器的一个请求结束了该池,那么它也会终止所有其他请求的池(如果我错了,请更正我!我只是在这里猜测)。如果真是这样,那么我永远也不会调用pool.end(),因为只要节点服务器正在运行,我也想保持tje pool处于打开状态/活动状态,因此对于其他服务器请求也是如此。这就让人质疑,我在哪里结束泳池?永远打开它可以吗?这是否与文档中所述的整个You must always return the client to the pool if you successfully check it out规则冲突?

1 个答案:

答案 0 :(得分:1)

如果使用MyType instance; if (weakRef.TryGetTarget(out instance)) { // resurrected, still can use it } else { // object is collected, the new one should be created } 语法,则无需担心将连接释放回池中。它为您处理关闭连接。我认为这是使用pg pool的正确方法。您可以/应该摆脱包含await pool.query代码段的第二个try / catch块。

如果使用旧式pool.end()语法,则需要调用pool.connect将连接释放回池中。即

done()