Ad Alanları
Bir Ad Alanı, uygulamanızın mantığını tek bir paylaşılan bağlantı üzerinden bölmenize olanak tanıyan bir iletişim kanalıdır (aynı zamanda "multiplexing" olarak da adlandırılır).
Giriş
Her ad alanının kendine ait:
olay işleyicileri
io.of("/orders").on("connection", (socket) => {
socket.on("order:list", () => {});
socket.on("order:create", () => {});
});
io.of("/users").on("connection", (socket) => {
socket.on("user:list", () => {});
});
odalar
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"); // "orders" ad alanındaki odadan ayrıdır
userNamespace.to("room1").emit("holà");
});
middleware'ler
const orderNamespace = io.of("/orders");
orderNamespace.use((socket, next) => {
// soketin "orders" ad alanına erişimi olduğundan emin olun ve sonra
next();
});
const userNamespace = io.of("/users");
userNamespace.use((socket, next) => {
// soketin "users" ad alanına erişimi olduğundan emin olun ve sonra
next();
});
Olası kullanım senaryoları:
- Özel bir ad alanı oluşturmak istiyorsanız, yalnızca yetkili kullanıcıların bu alana erişmesi için o kullanıcılarla ilgili mantığı, uygulamanın geri kalanından ayırabilirsiniz.
const adminNamespace = io.of("/admin");
adminNamespace.use((socket, next) => {
// kullanıcının yeterli haklara sahip olduğundan emin olun
next();
});
adminNamespace.on("connection", socket => {
socket.on("delete user", () => {
// ...
});
});
- Uygulamanızın birden fazla kiracısı varsa, her kiracı için dinamik olarak bir ad alanı oluşturmak isteyebilirsiniz.
const workspaces = io.of(/^\/\w+$/);
workspaces.on("connection", socket => {
const workspace = socket.nsp;
workspace.emit("hello");
});
Ana Ad Alanı
Şu ana kadar, ana ad alanı olan /
ile etkileşime geçtiniz. io
örneği, tüm yöntemlerini devralır:
io.on("connection", (socket) => {});
io.use((socket, next) => { next() });
io.emit("hello");
// aslında eşdeğerdir
io.of("/").on("connection", (socket) => {});
io.of("/").use((socket, next) => { next() });
io.of("/").emit("hello");
Bazı eğitimler ayrıca io.sockets
'dan da bahsedebilir; bu, sadece io.of("/")
için bir takma addır.
io.sockets === io.of("/")
Özelleştirilmiş Ad Alanları
Özelleştirilmiş bir ad alanı kurmak için, sunucu tarafında of
işlevini çağırabilirsiniz:
const nsp = io.of("/my-namespace");
nsp.on("connection", socket => {
console.log("birisi bağlandı");
});
nsp.emit("hi", "herkese!");
İstemci Başlatma
Aynı köken sürümü:
const socket = io(); // veya io("/"), ana ad alanı
const orderSocket = io("/orders"); // "orders" ad alanı
const userSocket = io("/users"); // "users" ad alanı
Farklı köken/Node.js sürümü:
const socket = io("https://example.com"); // veya io("https://example.com/"), ana ad alanı
const orderSocket = io("https://example.com/orders"); // "orders" ad alanı
const userSocket = io("https://example.com/users"); // "users" ad alanı
Yukarıdaki örnekte yalnızca bir WebSocket bağlantısı kurulacak ve paketler otomatik olarak doğru ad alanına yönlendirilecektir.
Lütfen multiplexing'in aşağıdaki durumlarda devre dışı bırakılacağını unutmayın:
- Aynı ad alanı için birden fazla sahip olma
const socket1 = io();
const socket2 = io(); // multiplexing yok, iki ayrı WebSocket bağlantısı
- Farklı alanlar
const socket1 = io("https://first.example.com");
const socket2 = io("https://second.example.com"); // multiplexing yok, iki ayrı WebSocket bağlantısı
forceNew
seçeneğinin kullanımı
const socket1 = io();
const socket2 = io("/admin", { forceNew: true }); // multiplexing yok, iki ayrı WebSocket bağlantısı
Dinamik Ad Alanları
Ayrıca, bir düzenli ifade ile ya da bir fonksiyon ile dinamik olarak ad alanları oluşturmaya da olanak tanır:
io.of(/^\/dynamic-\d+$/);
veya bir fonksiyon ile:
io.of((name, auth, next) => {
next(null, true); // veya false, kreasyon reddedildiğinde
});
Yeni ad alanına connection
olayında erişiminiz vardır:
io.of(/^\/dynamic-\d+$/).on("connection", (socket) => {
const namespace = socket.nsp;
});
of()
yönteminin döndürülen değeri, üst ad alanı olarak adlandırdığımız şeydir; buradan:
middleware'ler
kaydedebilirsiniz
const parentNamespace = io.of(/^\/dynamic-\d+$/);
parentNamespace.use((socket, next) => { next() });
Middleware, her bir çocuk ad alanında otomatik olarak kaydedilecektir.
broadcast
olayları
const parentNamespace = io.of(/^\/dynamic-\d+$/);
parentNamespace.emit("hello"); // /dynamic-1, /dynamic-2, ... kullanıcılarına gönderilecektir
Mevcut ad alanları, dinamik ad alanlarına öncelik verir. Örneğin:
// "dynamic-101" ad alanını kaydedin
io.of("/dynamic-101");
io.of(/^\/dynamic-\d+$/).on("connection", (socket) => {
// "dynamic-101" ad alanındaki bağlantı için çağrılmayacaktır
});
Tam API
Namespace örneği tarafından sunulan tam API burada
bulunabilir.