簡體   English   中英

帶有 socket.io 和 postgres LISTEN 的 NodeJS

[英]NodeJS with socket.io and postgres LISTEN

每當我的 postgres 數據庫上的某個表被更改時,我都試圖讓我的前端監視事件。

Postgres 事件完美觸發,我能夠通過 Socker.io 連接將它們中繼,但我遇到了可靠性問題。 我得到(node:26) UnhandledPromiseRejectionWarning: Error: Client was closed and is not queryable errors 在我的服務器上,通常事件不會被 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
});

索引.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();
  })
});

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

在任何通知發生之前,您會立即release您獲得的數據庫客戶端,並且每次套接字斷開連接時都會收到錯誤消息,並且您嘗試在已釋放的客戶端上運行UNLISTEN命令,該客戶端的連接在 30 秒后關閉。

相反,使用

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

順便說一句,我建議不要為每個 socket.io 客戶端獲取一個新的數據庫連接,數據庫對此來說太有價值了。 相反,為您的應用程序創建一個客戶端(您甚至可能不需要池),讓它偵聽update_table事件(可能僅在連接套接字時),然后每個事件廣播到所有當前連接的套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM