MongoDB 介面
運作方式
MongoDB 介面仰賴 MongoDB 的變更串流(因此需要複製集或分片叢集)。
傳送至多個用戶端的每個封包(例如 io.to("room1").emit()
或 socket.broadcast.emit()
)會
- 傳送至連線至目前伺服器的所有相符用戶端
- 插入至 MongoDB 封頂集合,並由叢集的其他 Socket.IO 伺服器接收


此介面的原始程式碼可在此處找到。
支援的功能
功能 | socket.io 版本 | 支援 |
---|---|---|
Socket 管理 | 4.0.0 | ✅ 是(自版本 0.1.0 起) |
伺服器間通訊 | 4.1.0 | ✅ 是(自版本 0.1.0 起) |
具確認功能的廣播 | 4.5.0 | ✅ 是(自版本 0.2.0 起) |
連線狀態復原 | 4.6.0 | ✅ 是(自版本 0.3.0 起) |
安裝
npm install @socket.io/mongo-adapter mongodb
對於 TypeScript 使用者,您可能也需要 @types/mongodb
。
使用
在 Socket.IO 叢集內廣播封包是透過建立 MongoDB 文件,並在每個 Socket.IO 伺服器上使用 變更串流 來達成。
有兩種方法可以清除 MongoDB 中的文件
使用封頂集合
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";
const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";
const io = new Server();
const mongoClient = new MongoClient("mongodb://#:27017/?replicaSet=rs0");
await mongoClient.connect();
try {
await mongoClient.db(DB).createCollection(COLLECTION, {
capped: true,
size: 1e6
});
} catch (e) {
// collection already exists
}
const mongoCollection = mongoClient.db(DB).collection(COLLECTION);
io.adapter(createAdapter(mongoCollection));
io.listen(3000);
使用 TTL 索引
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";
const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";
const io = new Server();
const mongoClient = new MongoClient("mongodb://#:27017/?replicaSet=rs0");
await mongoClient.connect();
const mongoCollection = mongoClient.db(DB).collection(COLLECTION);
await mongoCollection.createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 3600, background: true }
);
io.adapter(createAdapter(mongoCollection, {
addCreatedAtField: true
}));
io.listen(3000);
選項
名稱 | 說明 | 預設值 | 新增於 |
---|---|---|---|
uid | 此節點的 ID | 隨機 ID | v0.1.0 |
requestsTimeout | 伺服器間請求的逾時時間,例如帶有確認功能的 fetchSockets() 或 serverSideEmit() | 5000 | v0.1.0 |
heartbeatInterval | 兩次心跳之間的毫秒數 | 5000 | v0.1.0 |
heartbeatTimeout | 在我們將節點視為已關閉之前,沒有心跳的毫秒數 | 10000 | v0.1.0 |
addCreatedAtField | 是否要將 createdAt 欄位新增到每個 MongoDB 文件 | false | v0.2.0 |
常見問題
使用 MongoDB 介面時,我是否仍需要啟用黏著式工作階段?
是。否則將導致 HTTP 400 回應(您正在連接的伺服器不知道 Socket.IO 會話)。
更多資訊可在此處找到 連結。
當 MongoDB 群集停機時會發生什麼事?
如果與 MongoDB 群集的連線中斷,行為將取決於 MongoDB 儲存體的 bufferMaxEntries
選項值
- 如果其值為
-1
(預設值),封包將緩衝直到重新連線。 - 如果其值為
0
,封包將只傳送給連接到目前伺服器的儲存體。
文件:http://mongodb.github.io/node-mongodb-native/3.6/api/global.html#MongoClientOptions
最新版本
版本 | 發布日期 | 發布說明 | 差異 |
---|---|---|---|
0.3.2 | 2024 年 1 月 | 連結 | 0.3.1...0.3.2 |
0.3.1 | 2024 年 1 月 | 連結 | 0.3.0...0.3.1 |
0.3.0 | 2023 年 2 月 | 連結 | 0.2.1...0.3.0 |
0.2.1 | 2022 年 5 月 | 連結 | 0.2.0...0.2.1 |
0.2.0 | 2022 年 4 月 | 連結 | 0.1.0...0.2.0 |
0.1.0 | 2021 年 6 月 | 連結 |
發射器
MongoDB 發射器允許從另一個 Node.js 程序將封包傳送給已連線的儲存體


安裝
npm install @socket.io/mongo-emitter mongodb
用法
const { Emitter } = require("@socket.io/mongo-emitter");
const { MongoClient } = require("mongodb");
const mongoClient = new MongoClient("mongodb://#:27017/?replicaSet=rs0");
const main = async () => {
await mongoClient.connect();
const mongoCollection = mongoClient.db("mydb").collection("socket.io-adapter-events");
const emitter = new Emitter(mongoCollection);
setInterval(() => {
emitter.emit("ping", new Date());
}, 1000);
}
main();
請參閱此處的秘笈 連結。