Knex.js не будет подключаться к postgres

#node.js #postgresql #knex.js

#node.js #postgresql #knex.js

Вопрос:

Я пытаюсь подключиться к базе данных PostgreSQL с помощью Knex.js , но я просто не могу установить связь. Единственное исключение, которое я вижу, это:

Ошибка KnexTimeoutError: Knex: тайм-аут получения соединения. Вероятно, пул заполнен. Вы пропускаете вызов .transacting (trx)?

Я создал этот простой тестовый скрипт, чтобы убедиться, что он не является частью нашей программы:

 const knex = require("knex")({
    client: 'pg',
    connection: {
        host : 'localhost',
        port: 5432,
        database: 'postgres',
        user: 'postgres',
        password: 'password'
    },
    pool: {
        afterCreate: (conn, done) => {
            console.log("Pool created");
            done(false, conn);
        }
    },
    debug: true,
    acquireConnectionTimeout: 2000
});

console.log("A")

const a = knex.raw('select 1 1 as result').then(result => console.log("A Success", result)).catch(err => console.log("A Error", err));

console.log("B")

const b = knex.select("thing").from("testdata").then(data => console.log("B Success", data)).catch(err => console.log("B Error", err));

console.log("C")

const c = knex.transaction(trx => {
    trx.select("thing").from("testdata")
        .then(data => {
            console.log("C Success", data);
        })
        .catch(err => {
            console.log("C Error", err);
        });
})
    .catch(err => {
        console.log("C Error", err);
    });

console.log("waiting on query")
// Promise.all([a, b, c]).then(() => {
//     console.log("Destroying")
//     knex.destroy()
// })  

Который выдает следующий вывод

 A
B
C
waiting on query
A Error KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (E:DEVworkniba-backendnode_modulesknexlibclient.js:347:26)
    at runNextTicks (internal/process/task_queues.js:58:5)
    at listOnTimeout (internal/timers.js:520:9)
    at processTimers (internal/timers.js:494:7) {
  sql: 'select 1 1 as result',
  bindings: undefined
}
B Error KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (E:DEVworkniba-backendnode_modulesknexlibclient.js:347:26) {
  sql: undefined,
  bindings: undefined
}
C Error KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (E:DEVworkniba-backendnode_modulesknexlibclient.js:347:26)
    at async Transaction.acquireConnection (E:DEVworkniba-backendnode_modulesknexlibtransaction.js:213:28)
  

Он никогда не вызывает метод afterCreate. Я пробовал это как с нашей базой данных разработчиков, используя настройки, которые работают для всех остальных, так и с локальной установкой postgres со всеми комбинациями настроек, которые я мог придумать. Я даже передал это другому члену команды, и это сработало нормально, так что в моей машине что-то не так, но я понятия не имею, что может это блокировать. Я не вижу никаких попыток подключения в журналах postgres, и, похоже, я не могу получить никаких улучшенных сообщений об ошибках для работы.

Если бы кто-нибудь мог придумать, что я могу попробовать, или способы получения дополнительной информации из Knex, я был бы очень признателен.

Комментарии:

1. Вы можете попробовать afterCreate полностью удалить и убедиться, что на вашем локальном компьютере запущен postgres. Также в вашем обработчике транзакций вы должны вернуть обещание от обработчика, чтобы вызвать неявную фиксацию / откат. По сути, все указывает на то, что postgres настроен таким образом, что он не принимает TCP-соединения.

Ответ №1:

Я проследил проблему до версии пакета ‘pg’, который мы использовали. Использовал 7.18, и когда я обновился до последней версии (8.4), он начал подключаться. Понятия не имею, почему версия 7.x не работала.

Комментарии:

1. БОЛЬШОЕ ВАМ СПАСИБО ЗА ПУБЛИКАЦИЮ ЭТОГО. 🙂 У нас был код, который перестал работать, и изменение версии pg сработало. 🙂