【问题标题】:NodeJS with socket.io and postgres LISTENNodeJS 与 socket.io 和 postgres 听
【发布时间】:2020-09-03 15:54:09
【问题描述】:

我试图让我的前端在我的 postgres 数据库上的某个表发生更改时监视事件。

Postgres 事件完美触发,我可以通过 Socker.io 连接将它们中继到,但我遇到了可靠性问题。我的服务器上出现(node:26) UnhandledPromiseRejectionWarning: Error: Client was closed and is not queryable 错误,并且事件通常不会被 Socket 发出和捕获。我认为这与我连接到 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();
  })
});

我收到有关某些表更改的通知,但非常不一致。

【问题讨论】:

    标签: javascript node.js websocket socket.io pg


    【解决方案1】:

    在任何通知发生之前,您立即releaseing 获取的数据库客户端,并且每次套接字断开连接并且您尝试在已发布的客户端上运行UNLISTEN 命令时,您都会收到错误消息其连接在 30 秒后关闭。

    改为使用

    socket.on("disconnect", async () => {
      try {
        await client.query('UNLISTEN update_table');
      } finally {
        release();
      }
    });
    

    顺便说一句,我建议不要为每个 socket.io 客户端获取新的数据库连接,因为数据库太有价值了。相反,为您的应用程序创建一个客户端(您甚至可能不需要一个池),让它监听 update_table 事件(可能仅在连接套接字时),然后将每个事件 broadcast 监听到所有当前连接的套接字.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 2018-06-02
      相关资源
      最近更新 更多