Spec-Zone.ru › Socket.IO 3
Пространства имён Пространство имён — это канал связи, который позволяет разделить логику вашего приложения на отдельные части по единому общему соединению (также называемому «мультиплексированием»).
Введение
У каждого пространства имён есть свои:
io.of("/orders").on("connection", (socket) => {
socket.on("order:list", () => {});
socket.on("order:create", () => {});
});
io.of("/users").on("connection", (socket) => {
socket.on("user:list", () => {});
});
const orderNamespace = io.of("/orders");
orderNamespace.on("connection", (socket) => {
socket.join("room1");
orderNamespace.to("room1").emit("hello");
});
const userNamespace = io.of("/users");
userNamespace.on("connection", (socket) => {
socket.join("room1"); // distinct from the room in the "orders" namespace
userNamespace.to("room1").emit("holà");
});
const orderNamespace = io.of("/orders");
orderNamespace.use((socket, next) => {
// ensure the socket has access to the "orders" namespace, and then
next();
});
const userNamespace = io.of("/users");
userNamespace.use((socket, next) => {
// ensure the socket has access to the "users" namespace, and then
next();
});
Возможные варианты использования:
вы хотите создать специальное пространство имён, к которому имеют доступ только авторизованные пользователи, чтобы логика, связанная с этими пользователями, была отделена от остальной части приложения const adminNamespace = io.of("/admin");
adminNamespace.use((socket, next) => {
// ensure the user has sufficient rights
next();
});
adminNamespace.on("connection", socket => {
socket.on("delete user", () => {
// ...
});
});
ваше приложение имеет несколько арендаторов, поэтому вы хотите динамически создавать по одному пространству имён на каждого арендатора const workspaces = io.of(/^\/\w+$/);
workspaces.on("connection", socket => {
const workspace = socket.nsp;
workspace.emit("hello");
});
Основное пространство имён
До сих пор вы взаимодействовали с основным пространством имён, называемым /. Экземпляр io наследует все его методы:
io.on("connection", (socket) => {});
io.use((socket, next) => { next() });
io.emit("hello");
// are actually equivalent to
io.of("/").on("connection", (socket) => {});
io.of("/").use((socket, next) => { next() });
io.of("/").emit("hello");
В некоторых руководствах также может упоминаться io.sockets, это просто псевдоним для io.of("/").
io.sockets === io.of("/")
Настраиваемые пространства имён
Чтобы настроить пользовательское пространство имён, вы можете вызвать функцию of на стороне сервера:
const nsp = io.of("/my-namespace");
nsp.on("connection", socket => {
console.log("someone connected");
});
nsp.emit("hi", "everyone!");
Инициализация клиента
Версия с одинаковым происхождением:
const socket = io(); // or io("/"), the main namespace
const orderSocket = io("/orders"); // the "orders" namespace
const userSocket = io("/users"); // the "users" namespace
Версия с различным происхождением/Node.js:
const socket = io("https://example.com"); // or io("https://example.com/"), the main namespace
const orderSocket = io("https://example.com/orders"); // the "orders" namespace
const userSocket = io("https://example.com/users"); // the "users" namespace
В примере выше будет установлено только одно соединение WebSocket, а пакеты будут автоматически маршрутизированы в нужное пространство имён.
Обратите внимание, что мультиплексирование будет отключено в следующих случаях:
несколько созданий для одного и того же пространства имён const socket1 = io();
const socket2 = io(); // no multiplexing, two distinct WebSocket connections
const socket1 = io("https://first.example.com");
const socket2 = io("https://second.example.com"); // no multiplexing, two distinct WebSocket connections
const socket1 = io();
const socket2 = io("/admin", { forceNew: true }); // no multiplexing, two distinct WebSocket connections
Динамические пространства имён
Также можно динамически создавать пространства имён, либо с использованием регулярного выражения:
io.of(/^\/dynamic-\d+$/);
либо с использованием функции:
io.of((name, auth, next) => {
next(null, true); // or false, when the creation is denied
});
Вы можете получить доступ к новому пространству имён в событии connection:
io.of(/^\/dynamic-\d+$/).on("connection", (socket) => {
const namespace = socket.nsp;
});
Возвращаемое значение метода of() — это то, что мы называем родительским пространством имён, из которого вы можете:
const parentNamespace = io.of(/^\/dynamic-\d+$/);
parentNamespace.use((socket, next) => { next() });
Средство промежуточного слоя будет автоматически зарегистрировано в каждом дочернем пространстве имён.
const parentNamespace = io.of(/^\/dynamic-\d+$/);
parentNamespace.emit("hello"); // will be sent to users in /dynamic-1, /dynamic-2, ...
Полный API
Полный API, предоставляемый экземпляром Namespace, можно найти здесь .