#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 работать.