Как использовать пул Postgres на сервере NodeJS / Express - PullRequest
0 голосов
/ 28 марта 2019

Новое в 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.Это имеет смысл, я завершил пул в этом запросе, но в то же время это не имеет смысла.Я предполагаю, что пулы / клиенты не привязаны к отдельным запросам к серверу, как я первоначально думал, что означает, что если один запрос к серверу Node завершает пул, он также завершает пул для всех других запросов (пожалуйста, исправьте меня, если я ошибаюсьЯ просто догадываюсь здесь).Если это так, то я никогда не смогу вызвать pool.end (), поскольку я хотел бы, чтобы пул tje был открыт / активен, пока работает сервер Node, для других запросов к серверу.Возникает вопрос: где мне закончить пул?Можно ли оставить его открытым навсегда?Это противоречит целому правилу You must always return the client to the pool if you successfully check it out, указанному в документации?

1 Ответ

1 голос
/ 28 марта 2019

Если вы используете синтаксис await pool.query, вам не нужно беспокоиться об освобождении соединения обратно в пул.Он обрабатывает закрытие соединения для вас.На мой взгляд, это правильный способ использования pg pool.Вы можете / должны избавиться от 2-го блока try / catch, который содержит фрагмент кода pool.end().

Если вы используете синтаксис старой школы 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
    });
});
...