Postgres 適配器
運作方式
Postgres 適配器依賴於 NOTIFY 和 LISTEN 指令。
傳送至多個用戶端的每個封包(例如 io.to("room1").emit()
或 socket.broadcast.emit()
)會
- 傳送至連線至目前伺服器的所有相符用戶端
- 如果封包包含二進位資料或超過 8000 位元組限制,則封包會
- 使用 msgpack 編碼並插入至輔助資料表
- 列 ID 會在 NOTIFY 指令中傳送
- 此列 ID 會由叢集中的其他 Socket.IO 伺服器接收,這些伺服器會查詢資料表、解碼封包,然後廣播至其自己的一組連線用戶端
- 否則,封包會直接在 NOTIFY 指令中傳送,並由叢集中的其他 Socket.IO 伺服器接收


此適配器的原始程式碼可以在 這裡 找到。
支援的功能
功能 | socket.io 版本 | 支援 |
---|---|---|
Socket 管理 | 4.0.0 | ✅ 是 (自版本 0.1.0 起) |
伺服器間通訊 | 4.1.0 | ✅ 是 (自版本 0.1.0 起) |
廣播並確認 | 4.5.0 | ✅ 是 (自版本 0.3.0 起) |
連線狀態復原 | 4.6.0 | ❌ 否 |
安裝
npm install @socket.io/postgres-adapter pg
對於 TypeScript 使用者,您可能也需要 @types/pg
。
用法
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/postgres-adapter";
import pg from "pg";
const io = new Server();
const pool = new pg.Pool({
user: "postgres",
host: "localhost",
database: "postgres",
password: "changeit",
port: 5432,
});
pool.query(`
CREATE TABLE IF NOT EXISTS socket_io_attachments (
id bigserial UNIQUE,
created_at timestamptz DEFAULT NOW(),
payload bytea
);
`);
pool.on("error", (err) => {
console.error("Postgres error", err);
});
io.adapter(createAdapter(pool));
io.listen(3000);
選項
名稱 | 說明 | 預設值 |
---|---|---|
uid | 此節點的 ID | 隨機 ID |
channelPrefix | 通知頻道的字首 | socket.io |
tableName | 超過 8000 位元組限制或包含二進位資料的有效負載的資料表名稱 | socket_io_attachments |
payloadThreshold | 有效負載大小的位元組數閾值 | 8000 |
requestsTimeout | 伺服器間請求的逾時時間,例如帶有確認的 fetchSockets() 或 serverSideEmit() | 5000 |
heartbeatInterval | 兩次心跳之間的毫秒數 | 5000 |
heartbeatTimeout | 在我們將節點視為已關閉之前,沒有心跳的毫秒數 | 10000 |
cleanupInterval | 兩次清理查詢之間的毫秒數 | 30000 |
常見問題
使用 Postgres 介面時,我是否仍需要啟用固定連線?
是。未執行此操作將導致 HTTP 400 回應 (您抵達的伺服器不知道 Socket.IO 連線)。
更多資訊可在此處找到 here。
當 Postgres 伺服器關閉時會發生什麼事?
如果與 Postgres 伺服器的連線中斷,封包將只會傳送給連線至目前伺服器的用戶端。
最新版本
版本 | 發佈日期 | 發佈說明 | 差異 |
---|---|---|---|
0.3.1 | 2023 年 2 月 | 連結 | 0.3.0...0.3.1 |
0.3.0 | 2022 年 4 月 | 連結 | 0.2.0...0.3.0 |
0.2.0 | 2021 年 12 月 | 連結 | 0.1.1...0.2.0 |
0.1.1 | 2021 年 6 月 | 連結 | 0.1.0...0.1.1 |
0.1.0 | 2021 年 6 月 | 連結 |
Emitter
Postgres 發射器允許從另一個 Node.js 程序將封包傳送給已連線的用戶端


安裝
npm install @socket.io/postgres-emitter pg
用法
const { Emitter } = require("@socket.io/postgres-emitter");
const { Pool } = require("pg");
const pool = new Pool({
user: "postgres",
host: "localhost",
database: "postgres",
password: "changeit",
port: 5432,
});
const emitter = new Emitter(pool);
setInterval(() => {
emitter.emit("ping", new Date());
}, 1000);
請參閱此處的秘笈 連結。
最新版本
版本 | 發佈日期 | 發佈說明 | 差異 |
---|---|---|---|
0.1.0 | 2021 年 6 月 | 連結 |