首页 > 解决方案 > 使用 node pg (postgres) 客户端处理错误和恢复

问题描述

我在我的应用程序中使用节点模块 pg,我想确保它可以正确处理连接和查询错误。

我遇到的第一个问题是我想确保它可以在 postgres 不可用时正确恢复。

我发现有一个错误事件,所以我可以检测是否有连接错误。

import pg from 'pg'
let pgClient = null
async function postgresConnect() {
  pgClient = new pg.Client(process.env.CONNECTION_STRING)
  pgClient.connect()

  pgClient.on('error', async (e) => {
    console.log('Reconnecting')
    await sleep(5000)
    await postgresConnect()
  })
}

我不喜欢在这里使用全局,我想设置睡眠延迟来做一个小的指数退避。我注意到“重新连接”立即触发两次,然后等待五秒钟,我不确定为什么它第一次触发而没有任何等待。

我还必须确保查询执行。我有类似的东西我正在尝试。

async function getTimestamp() {
  try {
    const res = await pgClient.query(
      'select current_timestamp from current_timestamp;'
    )
    return res.rows[0].current_timestamp
  } catch (error) {
    console.log('Retrying Query')
    await sleep(1000)
    return getTimestamp()
  }
}

这似乎可行,但我没有对其进行足够的测试以确保它可以保证查询被执行或继续尝试。我应该寻找特定的错误,只在某些错误上永远循环,而在其他错误上失败。我需要做更多的研究来找出抛出了什么错误。我也需要对这里的延迟进行退避。

这一切“似乎”都有效,我不想让邓宁-克鲁格效应的受害者失败。我需要确保这个过程可以处理各种情况并恢复。

标签: javascriptnode.jspostgresql

解决方案


推荐阅读