postgres データベース上の特定のテーブルが変更されるたびに、フロントエンドでイベントを監視できるようにしようとしています。
Postgres イベントは完全に起動し、Socker.io 接続を介してイベントを中継できますが、信頼性の問題が発生します。サーバー上で (node:26) UnhandledPromiseRejectionWarning: Error: Client was Closed and is not queryable エラーが発生し、多くの場合、イベントが発行されず、ソケットによってキャッチされません。これは、Socket / db クライアントへの接続方法に関係していると思います。
ページ設定:
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();
})
});
特定のテーブルの変更について通知を受け取りますが、非常に一貫性がありません。
------------------------
--
通知が発生する前に、取得したデータベース クライアントをすぐに解放しているため、ソケットが切断され、その後接続が閉じられた解放されたクライアントで UNLISTEN コマンドを実行しようとするたびにエラー メッセージが表示されます。 30 代。
代わりに、
を使用してください。
socket.on("disconnect", async () => {
try {
await client.query('UNLISTEN update_table');
} finally {
release();
}
});
ところで、socket.io クライアントごとに新しいデータベース接続を取得しないことをお勧めします。データベースはそのためにはあまりにも貴重です。代わりに、アプリ用に単一のクライアントを作成し (プールが必要ない場合もあります)、それに update_table イベントをリッスンさせて (ソケットが接続されている場合のみ)、現在接続されているすべてのソケットに各イベントをブロードキャストします。
0