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

问题描述 投票:0回答:1

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]})
});

我运行服务器,使用Postman打电话给这个/test路线,一切正常。但是,如果我再次拨打同一个电话,这次我得到错误Error: Cannot use a pool after calling end on the pool。这是有道理的,我在这个请求中结束了池,但同时它没有意义。我猜测池/客户端并不像我原先想的那样依赖于单个服务器请求,这意味着如果一个请求到节点服务器结束池,它也会结束所有其他请求的池(如果我错了请纠正我)我只是在这里猜测。如果是这种情况,那么我永远不能调用pool.end(),因为只要节点服务器正在运行,我想保持池打开/活动,以及其他服务器请求。这有问题,我在哪里结束游泳池?可以永远打开它吗?这是否与文档中陈述的整个You must always return the client to the pool if you successfully check it out规则发生冲突?

node.js postgresql express node-postgres
1个回答
1
投票

如果您使用的是await pool.query语法,则无需担心将连接释放回池中。它处理为您关闭连接。这是我认为使用pg池的正确方法。你可以/应该摆脱包含pool.end()代码片段的第二个try / catch块。

如果你使用旧学校pool.connect语法,你需要调用done()释放连接回池。即

pool.connect(function(err, client, done) {
    var sql = "SELECT * FROM users WHERE username = $1";
    var values = [username];

    client.query(sql, values, function(err, result) {
        done(); // releases connection back to the pool        
        // Handle results
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.