跳到主要內容
版本:4.x

MongoDB 介面

運作方式

MongoDB 介面仰賴 MongoDB 的變更串流(因此需要複製集或分片叢集)。

傳送至多個用戶端的每個封包(例如 io.to("room1").emit()socket.broadcast.emit())會

  • 傳送至連線至目前伺服器的所有相符用戶端
  • 插入至 MongoDB 封頂集合,並由叢集的其他 Socket.IO 伺服器接收
Diagram of how the MongoDB adapter worksDiagram of how the MongoDB adapter works

此介面的原始程式碼可在此處找到

支援的功能

功能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隨機 IDv0.1.0
requestsTimeout伺服器間請求的逾時時間,例如帶有確認功能的 fetchSockets()serverSideEmit()5000v0.1.0
heartbeatInterval兩次心跳之間的毫秒數5000v0.1.0
heartbeatTimeout在我們將節點視為已關閉之前,沒有心跳的毫秒數10000v0.1.0
addCreatedAtField是否要將 createdAt 欄位新增到每個 MongoDB 文件falsev0.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.22024 年 1 月連結0.3.1...0.3.2
0.3.12024 年 1 月連結0.3.0...0.3.1
0.3.02023 年 2 月連結0.2.1...0.3.0
0.2.12022 年 5 月連結0.2.0...0.2.1
0.2.02022 年 4 月連結0.1.0...0.2.0
0.1.02021 年 6 月連結

完整變更日誌

發射器

MongoDB 發射器允許從另一個 Node.js 程序將封包傳送給已連線的儲存體

Diagram of how the MongoDB adapter worksDiagram of how the MongoDB adapter works

安裝

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();

請參閱此處的秘笈 連結