узел-postgres выдает “Ошибка: истек тайм-аут”

#node.js #postgresql #node-postgres

Вопрос:

У меня есть этот супер простой node-postgres пример, который я просто не могу запустить:

 const { Client } = require('pg')

const postgresOptions = {
  connectionString: 'postgres://REDACTED:REDACTED@hattie.db.elephantsql.com/REDACTED',
  connectionTimeoutMillis: 10000
}

const runDatabaseFunction = async function (functionToRun) {
  // Connect db
  const client = new Client(postgresOptions)
  await client.connect() // Here’s where it times out after 10 seconds
  // Run function
  // const results = await functionToRun(client)
  // Release db
  await client.end()
  return results
}

async function dbTest () {
  const result = await runDatabaseFunction()
}

dbTest()
 

Через 10000 миллисекунд время ожидания истекает await client.connect() с этой ошибкой:

 (node:80229) UnhandledPromiseRejectionWarning: Error: timeout expired
    at Timeout._onTimeout (/REDACTED/node_modules/pg/lib/client.js:95:26)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7)
    at emitUnhandledRejectionWarning (internal/process/promises.js:168:15)
    at processPromiseRejections (internal/process/promises.js:247:11)
    at processTicksAndRejections (internal/process/task_queues.js:94:32)
 

Почему?! Любые советы будут полезны.

  • Те же проблемы как с Heroku Postgres, так и с ElephantSQL.
  • Подключение с psql помощью или Postico для Mac работает просто отлично, та же строка подключения.

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

1. Вероятно, проблема с брандмауэром. Но что произойдет, если вы используете psql для подключения к одному и тому же URL-адресу?

2. Не пробовал psql , но Postico для Mac отлично работает с той же строкой подключения.

Ответ №1:

не должна ли строка подключения быть без «DATABASE_URL=» :

   connectionString: 'postgres://REDACTED:REDACTED@hattie.db.elephantsql.com/REDACTED',
 

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

1. Ах, это была опечатка, ее не было в реальном коде, сейчас я обновил свой пример. Спасибо, что заметили. Однако ошибка остается.

Ответ №2:

Я думаю, что вы пропустили порт бд здесь.

Небольшое предположение. В соответствии с документами вы можете указать конфигурации клиента по отдельности, что, на мой взгляд, более читабельно и более настраиваемо (если вы хотите, вы можете экстернализировать конфигурации позже). Таким образом, вы можете определить cofig, как показано ниже.

 const client = new Client({
  host: 'my.database-server.com',
  port: 5334,
  user: 'database-user',
  password: 'secretpassword!!',
})
 

См. здесь: документы клиента pg

Кроме того, вы должны передать функцию calle runDatabaseFunction() , чтобы на нее можно было ссылаться, как fucntionToRun в вашем коде, где я ее не вижу. В противном случае, хотя вы могли бы успешно подключиться к базе данных, исправив timeout error ошибку, вы получите ReferenceError .

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

1. Я добавил порт 5432 (такой же, как у клиента Postico), как этот connectionString: 'postgres://REDACTED:REDACTED@hattie.db.elephantsql.com:5432/REDACTED' , но с той же проблемой.

2. Вы уверены, что ваш хост БД запущен и работает? Потому что я опробовал тот же код, подключившись к одному из моих кластеров БД, и он отлично работает, когда я комментирую const results = await functionToRun(client) строку. Потому что вы не предоставили там никакой функции, и вы получите ошибку ссылки.

3. Да, потому что подключение к Postico для Mac работает просто отлично.

Ответ №3:

Это оказалась старая версия pg . Я расширил свой поиск до проблем Node.js/Postgres и нашел этот комментарий.

Так что обновление:

 "pg": "^8.7.1",
 

…Я заставил его работать на слонов. Heroku Postgres все еще боролся с проблемами SSL, но, добавив это в конфигурацию:

 const postgresOptions = {
  // ...
  ssl: { rejectUnauthorized: false }
}
 

…Я тоже заставил Heroku Postgres работать.