Ir al contenido principal
Versión: 4.x

Adaptador MongoDB

Cómo funciona

El adaptador MongoDB se basa en los Change Streams de MongoDB (y por lo tanto requiere un replica set o un clúster sharded).

Cada paquete que se envía a múltiples clientes (ej. io.to("room1").emit() o socket.broadcast.emit()) es:

  • enviado a todos los clientes coincidentes conectados al servidor actual
  • insertado en una colección capped de MongoDB, y recibido por los otros servidores Socket.IO del clúster
Diagrama de cómo funciona el adaptador MongoDBDiagrama de cómo funciona el adaptador MongoDB

El código fuente de este adaptador se puede encontrar aquí.

Características soportadas

CaracterísticaVersión de socket.ioSoporte
Gestión de sockets4.0.0✅ SÍ (desde versión 0.1.0)
Comunicación entre servidores4.1.0✅ SÍ (desde versión 0.1.0)
Broadcast con acknowledgements4.5.0✅ SÍ (desde versión 0.2.0)
Recuperación del estado de conexión4.6.0✅ SÍ (desde versión 0.3.0)

Instalación

npm install @socket.io/mongo-adapter mongodb

Para usuarios de TypeScript, también podrías necesitar @types/mongodb.

Uso

La transmisión de paquetes dentro de un clúster Socket.IO se logra creando documentos MongoDB y usando un change stream en cada servidor Socket.IO.

Hay dos formas de limpiar los documentos en MongoDB:

Uso con una colección capped

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) {
// la colección ya existe
}
const mongoCollection = mongoClient.db(DB).collection(COLLECTION);

io.adapter(createAdapter(mongoCollection));
io.listen(3000);

Uso con un índice 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);

Opciones

NombreDescripciónValor predeterminadoAgregado en
uidEl ID de este nodoun id aleatoriov0.1.0
requestsTimeoutEl timeout para solicitudes entre servidores como fetchSockets() o serverSideEmit() con ack5000v0.1.0
heartbeatIntervalEl número de ms entre dos heartbeats5000v0.1.0
heartbeatTimeoutEl número de ms sin heartbeat antes de considerar un nodo caído10000v0.1.0
addCreatedAtFieldSi agregar un campo createdAt a cada documento MongoDBfalsev0.2.0
changeStreamOptionsOpciones a pasar al change stream de MongoDB{}v0.4.0

Preguntas frecuentes

¿Todavía necesito habilitar sesiones sticky al usar el adaptador MongoDB?

Sí. No hacerlo resultará en respuestas HTTP 400 (estás llegando a un servidor que no conoce la sesión Socket.IO).

Más información se puede encontrar aquí.

¿Qué pasa cuando el clúster MongoDB está caído?

En caso de que la conexión al clúster MongoDB se corte, el comportamiento dependerá del valor de la opción bufferMaxEntries del cliente MongoDB:

  • si su valor es -1 (predeterminado), los paquetes se almacenarán en buffer hasta la reconexión.
  • si su valor es 0, los paquetes solo se enviarán a los clientes que están conectados al servidor actual.

Documentación: http://mongodb.github.io/node-mongodb-native/3.6/api/global.html#MongoClientOptions

Últimas versiones

VersiónFecha de lanzamientoNotas de lanzamientoDiff
0.4.0Agosto 2025link0.3.2...0.4.0
0.3.2Enero 2024link0.3.1...0.3.2
0.3.1Enero 2024link0.3.0...0.3.1
0.3.0Febrero 2023link0.2.1...0.3.0

Changelog completo

Emitter

El emitter MongoDB permite enviar paquetes a los clientes conectados desde otro proceso Node.js:

Diagrama de cómo funciona el adaptador MongoDBDiagrama de cómo funciona el adaptador MongoDB

Instalación

npm install @socket.io/mongo-emitter mongodb

Uso

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

Por favor consulta la hoja de referencia aquí.