Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用socket.io和postgres侦听的NodeJS_Javascript_Node.js_Websocket_Socket.io_Pg - Fatal编程技术网

Javascript 使用socket.io和postgres侦听的NodeJS

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

每当我的postgres db上的某个表被更改时,我都试图让我的前端监视事件

Postgres事件可以完美启动,我可以通过Socker.io连接将它们转发到,但我遇到了可靠性问题。我在服务器上收到
(节点: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表
事件(可能仅在连接套接字时),然后将每个事件发送到所有当前连接的套接字