MongoDB 适配器
工作原理
MongoDB 适配器依赖于 MongoDB 的 变更流(因此需要副本集或分片集群)。
发送到多个客户端的每个数据包(例如 io.to("room1").emit()
或 socket.broadcast.emit()
)将
- 发送到连接到当前服务器的所有匹配客户端
- 插入到 MongoDB 有上限的集合中,并由集群中的其他 Socket.IO 服务器接收


此适配器的源代码可以在这里找到 这里.
支持的功能
功能 | socket.io 版本 | 支持 |
---|---|---|
套接字管理 | 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://localhost: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://localhost: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 | 是否向每个 MongoDB 文档添加 createdAt 字段 | 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://localhost: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();
请参考速查表 这里.