node-postgres gives “Error: timeout expired”
node-postgres gives “Error: timeout expired”
我有一个超级简单的 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
或 Mac 的 Postico 工作正常,相同的连接字符串。
连接字符串不应该没有“DATABASE_URL=”:
connectionString: 'postgres://REDACTED:REDACTED@hattie.db.elephantsql.com/REDACTED',
我想你错过了这里的数据库端口。
小建议。根据文档,您可以单独指定客户端配置,在我看来,这更具可读性和可配置性(如果您愿意,您可以稍后将配置外部化)。所以你可以定义配置如下。
const client = new Client({
host: 'my.database-server.com',
port: 5334,
user: 'database-user',
password: 'secretpassword!!',
})
参考这里:pg Client docs
除此之外,您必须将调用函数传递给 runDatabaseFunction()
,以便它可以在您的代码中被引用为 fucntionToRun
,而我看不到它。否则,尽管您可以通过修复 timeout error
成功连接到数据库,但您将获得 ReferenceError
.
原来是旧版本的pg
。我扩大搜索到Node.js/Postgres问题,发现this comment .
所以升级:
"pg": "^8.7.1",
…我让它为 ElephantSQL 工作。 Heroku Postgres 仍然在 SSL 问题上苦苦挣扎,但是通过将其添加到配置中:
const postgresOptions = {
// ...
ssl: { rejectUnauthorized: false }
}
…我也让 Heroku 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
或 Mac 的 Postico 工作正常,相同的连接字符串。
连接字符串不应该没有“DATABASE_URL=”:
connectionString: 'postgres://REDACTED:REDACTED@hattie.db.elephantsql.com/REDACTED',
我想你错过了这里的数据库端口。
小建议。根据文档,您可以单独指定客户端配置,在我看来,这更具可读性和可配置性(如果您愿意,您可以稍后将配置外部化)。所以你可以定义配置如下。
const client = new Client({
host: 'my.database-server.com',
port: 5334,
user: 'database-user',
password: 'secretpassword!!',
})
参考这里:pg Client docs
除此之外,您必须将调用函数传递给 runDatabaseFunction()
,以便它可以在您的代码中被引用为 fucntionToRun
,而我看不到它。否则,尽管您可以通过修复 timeout error
成功连接到数据库,但您将获得 ReferenceError
.
原来是旧版本的pg
。我扩大搜索到Node.js/Postgres问题,发现this comment .
所以升级:
"pg": "^8.7.1",
…我让它为 ElephantSQL 工作。 Heroku Postgres 仍然在 SSL 问题上苦苦挣扎,但是通过将其添加到配置中:
const postgresOptions = {
// ...
ssl: { rejectUnauthorized: false }
}
…我也让 Heroku Postgres 工作。