Javascript 使用socket.io和postgres侦听的NodeJS
每当我的postgres db上的某个表被更改时,我都试图让我的前端监视事件 Postgres事件可以完美启动,我可以通过Socker.io连接将它们转发到,但我遇到了可靠性问题。我在服务器上收到Javascript 使用socket.io和postgres侦听的NodeJS,javascript,node.js,websocket,socket.io,pg,Javascript,Node.js,Websocket,Socket.io,Pg,每当我的postgres db上的某个表被更改时,我都试图让我的前端监视事件 Postgres事件可以完美启动,我可以通过Socker.io连接将它们转发到,但我遇到了可靠性问题。我在服务器上收到(节点:26)未处理的PromisejectionWarning:错误:客户端已关闭且不可查询错误,并且事件通常不会由套接字发出和捕获。我假设这与我连接Socket/db客户端的方式有关 pg配置: const {Pool} = require('pg'); const production = pro
(节点:26)未处理的PromisejectionWarning:错误:客户端已关闭且不可查询
错误,并且事件通常不会由套接字发出和捕获。我假设这与我连接Socket/db客户端的方式有关
pg配置:
const {Pool} = require('pg');
const production = process.env.NODE_ENV === 'production';
const connectionString = `postgresql://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_DATABASE}`
const pool = new Pool({
connectionString: process.env.CONNECTION_STRING ? process.env.CONNECTION_STRING : connectionString,
ssl: production,
connectionTimeoutMillis : 5000,
idleTimeoutMillis : 30000
});
index.js
io.of("/marketDetails").on('connect', (socket) => {
pool.connect((err, client, release) => {
if (err) {
console.log(err);
return;
}
client.query('LISTEN update_table');
client.on('notification', async(data) => {
console.log("notified of table change")
handleDBEvent(socket, data);
})
socket.on("disconnect", () => {
client.query('UNLISTEN update_table');
})
release();
})
});
我收到关于某些表更改的通知,但非常不一致。在任何通知发生之前,您将立即
释放所获取的数据库客户端,每次套接字断开连接时,您都会收到错误消息,并尝试在30秒后连接关闭的已发布客户端上运行UNLISTEN
命令
相反,使用
socket.on("disconnect", async () => {
try {
await client.query('UNLISTEN update_table');
} finally {
release();
}
});
顺便说一句,我建议不要为每个socket.io客户端获取新的数据库连接,因为数据库的价值太高了。相反,为您的应用程序创建一个客户端(您甚至可能不需要池),让它侦听update\u表
事件(可能仅在连接套接字时),然后将每个事件发送到所有当前连接的套接字