gpt4 book ai didi

postgresql - socket.io 在浏览器刷新时重复发出事件

转载 作者:行者123 更新时间:2023-11-29 11:35:45 24 4
gpt4 key购买 nike

我的 socket.io 实现遇到问题,不知道如何解决。我将 pg_notify 与 LISTEN 一起使用,因此当数据库中的某个值被修改时,它会向某个客户端发出“is_logged_in”。

这本身工作正常 - 我的问题是当我刷新页面时,socket.io 断开当前的 socket_id,像往常一样创建一个新的 socket_id,但是当这种情况发生时,它正在创建第二个 pgsql 客户端实例并复制请求 -触发“logged_in”事件 2 次。

如果我再次刷新页面,然后手动触发 pg“logged_in”触发器,它现在将发出 3 次等等。我有泄漏。

const io = require('socket.io')();
const pg = require('pg');

io.on('connection', (socket) => {

const pgsql = new pg.Client({
(host, port, user, pass, db)
})

pgsql.connect()
pgsql.query("LISTEN logged_in");

pgsql.on('notification', function (data) {
socket.to(json.socket_id).emit('is_logged_in', { status:'Y' });
});

socket.on('disconnect', () => {
//pgsql.end();
});

});

我试过终止 pgsql 实例(在 socket.on disconnect 中),但出于某种原因,当我这样做时,LISTEN 停止工作。

我也试过将新的 pg.Client 移到 io.on 连接之外,但是当我刷新页面时,旧的 socket_id 断开连接,新的连接,并且它从不执行重新创建 pg 客户端的代码。

有什么想法吗?

最佳答案

这些可能会产生问题:

  • pgsql 实例在每次套接字连接请求时创建,并且不会在断开连接时被销毁
  • notification 断开连接时不会删除处理程序

我不太熟悉 postgres,但我广泛使用 socket。所以,这样的事情应该可以解决您的问题:

const io = require('socket.io')();
const pg = require('pg');

const pgsql = new pg.Client({
(host, port, user, pass, db)
})

pgsql.connect();

io.on('connection', (socket) => {
pgsql.query("LISTEN logged_in");

const handler = function (data) {
socket.to(json.socket_id).emit('is_logged_in', { status:'Y' });
// You could also do pgsql.off('notification', handler) here probably
// or check if pgsql.once method is available as we need to call this handler only once?
}

pgsql.on('notification', handler);

socket.on('disconnect', () => {
pgsql.off('notification', handler);
//pgsql.end(); // Call it in server termination logic
});

});

关于postgresql - socket.io 在浏览器刷新时重复发出事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54191628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com