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)

为什么?!任何提示都有帮助。

连接字符串不应该没有“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 工作。