[英]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.