重新连接 Postgres 数据库在 Node.js 中的实现

3

我正在为我的 Express Web 服务器使用 Postgres 数据库。 我使用 'pg' 库在该数据库上执行查询。

这是我的连接方法:

const db = new Client({
    user: 'xxx',
    host: 'xxx',
    database: 'xxx',
    password: 'xxx',
    port: xxx,
})
db.connect(err => {
    if (err) {
        console.error('connection error', err.stack)
    } else {
        console.log('connected')
    }

然后执行请求我会这样做:

db.query(MY_REQUEST, function (err, data) {
            if (err) throw err;
            res.render('hello/world', {
                title: 'Hello',
                data: data.rows
            });
        });`

一切都运行得很完美。但是几分钟没有使用我的网站后,我的数据库连接超时,并出现以下错误:
node:events:355
throw er; // Unhandled 'error' event
       ^
Error: Connection terminated unexpectedly
at Connection.<anonymous> (/usr/src/app/node_modules/pg/lib/client.js:132:73)
at Object.onceWrapper (node:events:484:28)
at Connection.emit (node:events:378:20)
at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:58:12)
at Socket.emit (node:events:378:20)
at TCP.<anonymous> (node:net:665:12)
Emitted 'error' event on Client instance at:
at Client._handleErrorEvent (/usr/src/app/node_modules/pg/lib/client.js:319:10)
at Connection.<anonymous> (/usr/src/app/node_modules/pg/lib/client.js:149:16)
at Object.onceWrapper (node:events:484:28)
[... lines matching original stack trace ...]
at TCP.<anonymous> (node:net:665:12)

当连接中断或请求失败时,我该怎么做才能自动重新连接?

2个回答

2

为了避免未处理的错误导致应用程序崩溃,您应该附加一个error处理程序。这很简单:

db.on('error', e => {
  console.error('DB error', e);
});

关于为什么会出现错误,我们需要更多细节信息。看起来可能是由于空闲超时导致连接重置?


1
是的,当连接处于非活动状态时会出现超时,我希望保持这种行为,只是当我需要发出请求时,我的服务器可以自动重新连接到数据库并执行请求。 - mmmmmmm
使用您的解决方案,我成功重新连接了,但是我该如何重新运行触发错误的请求呢? - mmmmmmm

1
你可以创建一个函数来控制是否已连接到数据库,然后再继续执行主要函数。
创建一个用于控制数据库连接状态、重新连接等的函数,并在运行与数据库相关的函数之前,先启动该中间函数并等待结果,之后才能继续使用数据库。
如果您想(大多数情况下应该是首选方式),将该中间函数创建为异步函数并返回一个Promise,在使用该函数时,请等待该函数的返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接