Socket.IO - bagaimana cara saya mendapatkan daftar soket / klien yang terhubung?

159

Saya mencoba mendapatkan daftar semua soket / klien yang saat ini terhubung.

io.sockets sayangnya, tidak mengembalikan array.

Saya tahu saya bisa menyimpan daftar saya sendiri menggunakan array, tetapi jangan berpikir ini adalah solusi optimal karena 2 alasan:

  1. Redundansi. Socket.IO sudah menyimpan salinan daftar ini.

  2. Socket.IO menyediakan metode untuk menetapkan nilai-nilai bidang arbitrer untuk klien (yaitu:) socket.set('nickname', 'superman')sehingga saya harus mengikuti perubahan ini jika saya ingin mempertahankan daftar saya sendiri.

Tolong?

Andy Hin
sumber
Tidak bisakah Anda mengonversi io.sockets ke array?
mak 3'11
2
Dalam 0.7.6 io.sockets.sockets adalah objek hash sederhana id => socket
mak
1
Saya perhatikan itu, tetapi itu bertindak aneh (tidak tampak seperti objek soket standar). Sebagai contoh saya mencoba: pastebin.com/fxuzVckS tetapi dikatakan objek soket tidak mengandung metode 'get'.
Andy Hin
3
socketis id, io.sockets.sockets[socket]adalah socket.
mak
2
Argumen pertama adalah errdan jika Anda menggunakan penyimpanan memori itu selalu null. .get('nickname', function(err, nickname) { ... })
mak

Jawaban:

173

Di Socket.IO 0.7 Anda memiliki clients metode pada namespaces, ini mengembalikan array semua soket yang terhubung.

API tanpa ruang nama:

var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`

Untuk namespace

var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`

Semoga ini bisa membantu seseorang di masa depan

CATATAN: Solusi ini HANYA berfungsi dengan versi sebelum 1.0


DIPERBARUI 2020 Maret 06

Dari 1.x dan di atas, lihat tautan ini: dapatkan berapa banyak orang di ruang obrolan di socket.io

3rdEden
sumber
3
Saya pikir mereka telah menjatuhkan metode klien di 1.0 ... hanya memeriksa itu saat ini ...
markyzm
7
Mereka menjatuhkan hampir semuanya dalam 1,0 karena itu penulisan ulang lengkap. Tetapi karena 1.0 telah dirilis selama bertahun-tahun. Di 1.0 Anda harus menggunakan connectedobjek namespace.
3Edden
6
@ 3rdEden, apa sintaksis untuk menggunakan objek namespace yang terhubung? var clients = io.sockets.connected();jelas tidak bekerja. Terima kasih
Kaya Toast
5
Dari 1.x dan di atasnya: stackoverflow.com/questions/9352549/…
Musa Haidari
TypeError: fn.bind bukan fungsi
Iman Marashi
101

Socket.io 1.4

Object.keys(io.sockets.sockets); memberi Anda semua soket yang terhubung.

Socket.io 1.0 Pada socket.io 1.0, jawaban yang diterima sebenarnya tidak berlaku lagi. Jadi saya membuat fungsi kecil yang saya gunakan sebagai perbaikan sementara:

function findClientsSocket(roomId, namespace) {
    var res = []
    // the default namespace is "/"
    , ns = io.of(namespace ||"/");

    if (ns) {
        for (var id in ns.connected) {
            if(roomId) {
                var index = ns.connected[id].rooms.indexOf(roomId);
                if(index !== -1) {
                    res.push(ns.connected[id]);
                }
            } else {
                res.push(ns.connected[id]);
            }
        }
    }
    return res;
}

Api untuk Tanpa namespace menjadi

// var clients = io.sockets.clients();
// becomes : 
var clients = findClientsSocket();

// var clients = io.sockets.clients('room');
// all users from room `room`
// becomes
var clients = findClientsSocket('room');

Api untuk namespace menjadi:

// var clients = io.of('/chat').clients();
// becomes
var clients = findClientsSocket(null, '/chat');

// var clients = io.of('/chat').clients('room');
// all users from room `room`
// becomes
var clients = findClientsSocket('room', '/chat');

Lihat juga pertanyaan terkait ini , di mana saya memberikan fungsi yang mengembalikan soket untuk ruangan tertentu.

function findClientsSocketByRoomId(roomId) {
var res = []
, room = io.sockets.adapter.rooms[roomId];
if (room) {
    for (var id in room) {
    res.push(io.sockets.adapter.nsp.connected[id]);
    }
}
return res;
}

Socket.io 0.7

API tanpa ruang nama :

var clients = io.sockets.clients();
var clients = io.sockets.clients('room'); // all users from room `room`

Untuk namespace

var clients = io.of('/chat').clients();
var clients = io.of('/chat').clients('room'); // all users from room `room`

Catatan: Karena tampaknya socket.io API cenderung rusak, dan beberapa solusi bergantung pada detail implementasi, itu bisa menjadi masalah melacak klien sendiri:

var clients = [];

io.sockets.on('connect', function(client) {
    clients.push(client); 

    client.on('disconnect', function() {
        clients.splice(clients.indexOf(client), 1);
    });
});
nha
sumber
3
Terima kasih untuk ini. Saya terkejut mereka mengambil fungsi ini.
Tyler Scott
1
@TylerScott Me juga, terutama mengingat bahwa ini tidak tercakup dalam panduan migrasi mereka (kecuali saya kehilangan sesuatu). socket.io/docs/migrating-from-0-9
nha
@ nha, ini tidak berfungsi untuk saya tetapi mengembalikan array bilangan bulat, seperti 0, 1 dan 2 dll bukan array soket. Ada ide?
ThePixelPony
bagaimana dengan banyak simpul? karena saya menggunakan banyak simpul dengan redis store
John Nguyen
3
@nha jawaban Anda persis, tetapi tidak berfungsi untuk beberapa node dengan redis store server. dari 1 proses simpul, Anda tidak dapat memeriksa soket yang terhubung atau tidak dengan menggunakan ns.connected [id]
John Nguyen
46

Setelah socket.io 1.0 kita tidak bisa menggunakan

io.sockets.clients(); 
or
io.sockets.clients('room'); 

lagi. Sebagai gantinya Anda dapat menggunakan yang berikut ini

var clients_in_the_room = io.sockets.adapter.rooms[roomId]; 
for (var clientId in clients_in_the_room ) {
  console.log('client: %s', clientId); //Seeing is believing 
  var client_socket = io.sockets.connected[clientId];//Do whatever you want with this
}
salihcenap
sumber
3
saya ganti kevar clients_in_the_room = io.sockets.adapter.rooms[roomId].sockets
Fábio Zangirolami
37

Menggunakan Socket.IO 1.x:

Dapatkan berbagai klien yang terhubung:

io.engine === io.eio // => true
Object.keys(io.engine.clients) // => [ 'US8AxrUrrDF_G7ZUAAAA', 'Ov2Ca24Olkhf2NHbAAAB' ]
Object.keys(io.eio.clients)    // => [ 'US8AxrUrrDF_G7ZUAAAA', 'Ov2Ca24Olkhf2NHbAAAB' ]

Dapatkan jumlah klien yang terhubung:

io.engine.clientsCount // => 2
io.eio.clientsCount    // => 2
Joseph Dykstra
sumber
32

Sangat sederhana di socket.io 1.3:

io.sockets.sockets- adalah array yang berisi objek soket yang terhubung. Jika Anda menyimpan nama pengguna di setiap soket, Anda dapat melakukan:

io.sockets.sockets.map(function(e) {
    return e.username;
})

Ledakan. Anda memiliki nama semua pengguna yang terhubung.

or29544
sumber
2
Terima kasih! +1 untuk kesederhanaan. Apakah Anda tahu jika ada perbedaan antara metode ini dan, katakanlah, jawaban Joseph Dykstra? (Object.keys(io.engine.clients)
CyclingLinguist
4
Ini tidak berfungsi pada v1.4.5. Masih berusaha mencari solusi
Nuno Furtado
apakah Anda menemukannya? \
ocram
2
TypeError: io.sockets.sockets.map bukan fungsi
Király István
23

Saya telah melalui rasa sakit ini hari ini. Socket.io akan jauh lebih baik jika mereka bisa membuat dokumentasi yang tepat untuk API mereka.

Lagi pula, saya mencoba melihat ke dalam io.sockets dan menemukan sejumlah opsi yang dapat kita gunakan:

io.sockets.connected //Return {socket_1_id: {}, socket_2_id: {}} . This is the most convenient one, since you can just refer to io.sockets.connected[id] then do common things like emit()
io.sockets.sockets //Returns [{socket_1}, {socket_2}, ....]. Can refer to socket_i.id to distinguish
io.sockets.adapter.sids //Return {socket_1_id: {}, socket_2_id: {}} . Looks similar to the first one but the object is not actually the socket, just the information.

// Not directly helps but still relevant
io.sockets.adapter.rooms //Returns {room_1_id: {}, room_2_id: {}}
io.sockets.server.eio.clients //Return client sockets
io.sockets.server.eio.clientsCount //Return number of connected clients

Juga, perhatikan bahwa ketika menggunakan socket.io dengan namespace, metode di atas akan rusak karena io.sockets menjadi array bukan objek. Untuk menyelesaikannya, ganti saja io.sockets dengan io (mis. Io.sockets.connected menjadi io.connected, io.sockets.adapter.rooms menjadi io.adapter.rooms ...)

Diuji pada socket.io 1.3.5

Thanh Nguyen
sumber
1
@ Зелёный Ini akan berfungsi jika Anda tidak menggunakan namespace. Jika Anda menggunakan namespace, ubah ke io.server.eio.clientsCount
Thanh Nguyen
2
Ya, dokumentasi resmi dapat sangat ditingkatkan
CodeAndCats
18

Versi +2.0

Di versi +2.0 Anda menentukan namespace / kamar / node yang Anda tanyakan.

Seperti penyiaran, standarnya adalah semua klien dari namespace default ('/'):

const io = require('socket.io')();  
io.clients((error, clients) => {
      if (error) throw error;
      console.log(clients); // => [6em3d4TJP8Et9EMNAAAA, G5p55dHhGgUnLUctAAAB]
});

Mendapat daftar ID klien yang terhubung ke namespace tertentu (di semua node jika berlaku).

const io = require('socket.io')();
io.of('/chat').clients((error, clients) => {
     if (error) throw error;
     console.log(clients); // => [PZDoMHjiu8PYfRiKAAAF, Anw2LatarvGVVXEIAAAD]
});

Contoh untuk mendapatkan semua klien di ruang namespace:

const io = require('socket.io')();
io.of('/chat').in('general').clients((error, clients) => {
      if (error) throw error;
      console.log(clients); // => [Anw2LatarvGVVXEIAAAD] 
});

Ini dari dokumentasi resmi: Socket.IO Server-API

John Galt
sumber
1
apakah ada cara untuk melihat semua objek socket ? misalnya, jika saya menambahkan socket.usernameproperti ke setiap soket saat menghubungkan, apakah ada cara saya dapat melihat semua objek soket ini (termasuk properti khusus yang saya tambahkan ke setiap soket)? (untuk referensi, saya saat ini menggunakan variabel objek global untuk menyimpan informasi soket tambahan ketika klien terhubung - jadi tidak menanyakan cara mengaturnya - hanya tertarik mengetahui apakah ada cara untuk melihat semua objek soket secara 'default') .
user1063287
1
hmm, per jawaban ini , saya pikir Anda dapat melihat semua soket terhubung dengan console.log(io.sockets.connected)- tampaknya menjadi sebuah objek di mana setiap nilai properti adalah "objek socket" yang berisi sifat ini nsp, server, adaptor, id(string), client, conn, rooms, acks, connected, disconnected, handshake, fns, flags, _rooms, _events, _eventsCountdan akhirnya usernameyang merupakan properti kustom saya menambahkan satu sama soket koneksi.
user1063287
17

Saya pikir kita dapat mengakses objek soket dari server, dan Anda dapat menetapkan nama panggilan, dan mengarahkan id soketnya,

io.sockets.on('connection',function(socket){ 
    io.sockets.sockets['nickname'] = socket.id;
    client.on("chat", function(data) {      
        var sock_id = io.sockets.sockets['nickname']
        io.sockets.sockets[sock_id].emit("private", "message");
    });    
});

Pada disconnectsilakan hapus nama panggilan dari io.sockets.sockets.

sunil n jose
sumber
apa tujuan dari 'client.on'? Bisakah Anda menggunakan kode Anda seperti ini (hanya menerima data dari 1 soket) ?: io.sockets.sockets [sock_id] .on ('pesan baru', fungsi (data) {console.log (data)});
The Hawk
9

Ini adalah cara terbaik untuk mengaksesnya di socket.io 1.3

Object.keys(socket.adapter.rooms[room_id])

ksloan
sumber
tolong izinkan saya membagikan contoh ini, var room = io.sockets.adapter.rooms[room_id]; var connections = _.map(Object.keys(room), function(socketId){ return (io.sockets.connected[socketId].connected == true) });
Hany Alsamman
5

Bagi siapa pun yang hanya ingin COUNT dari klien yang terhubung saya yakin ini akan melakukannya:

io.sockets.manager.server.connections

crickeys
sumber
bukankah klien yang terhubung dihitung, diuji. (lebih banyak)
mrzmyr
5
untuk mendapatkan penghitungan penggunaan yang akuratio.sockets.clients().length
Ivo
2
Saat ini keduanya io.sockets.manager.server.connectionsdan io.sockets.clients().lengthtidak bekerja. Ini bekerja untuk saya - Hanya untuk hitungan - io.engine.clientsCountdan untuk daftar klien - io.engine.clientsCount. Sejak itu tetap seperti ini selama lebih dari 3 tahun. Sepertinya cara yang andal untuk mendapatkan info koneksi. (Berdasarkan jawaban Joseph Dykstra)
Aswin Ramakrishnan
5

Socket.io 1.4.4

Kode contoh untuk Anda.

function get_clients_by_room(roomId, namespace) {
        io.of(namespace || "/").in(roomId).clients(function (error, clients) {
            if (error) { throw error; }
            console.log(clients[0]); // => [Anw2LatarvGVVXEIAAAD]
            console.log(io.sockets.sockets[clients[0]]); //socket detail
            return clients;
        });
    }

Saya pikir akan membantu seseorang blok kode ini.

Tiago Zamperini
sumber
4

Di Socket.IO 1.4

Untuk mendapatkan larik Semua Pengguna yang terhubung:

var allConnectedClients = Object.keys(io.sockets.connected);// This will return the array of SockeId of all the connected clients

Untuk mendapatkan Hitungan semua klien:

var clientsCount = io.engine.clientsCount ; // This will return the count of connected clients
KIA
sumber
Saya mengkonfirmasi bahwa ini berfungsi dalam versi 1.5.1 dari socket.io
Sébastien
3

Pada socket.io 1.5, perhatikan perubahan dari indexOf yang tampaknya didepresiasi, dan diganti dengan valueOf

function findClientsSocket(roomId, namespace) {
    var res = [];
    var ns = io.of(namespace ||"/");    // the default namespace is "/"

    if (ns) {
        for (var id in ns.connected) {
            if (roomId) {
                //var index = ns.connected[id].rooms.indexOf(roomId) ;
                var index = ns.connected[id].rooms.valueOf(roomId) ; //Problem was here

                if(index !== -1) {
                    res.push(ns.connected[id]);
                }
            } else {
                res.push(ns.connected[id]);
            }
        }
    }
    return res.length;
}

Untuk socket.io versi 2.0.3, kode berikut berfungsi:

function findClientsSocket(io, roomId, namespace) {
    var res = [],
        ns = io.of(namespace ||"/");    // the default namespace is "/"

    if (ns) {
        for (var id in ns.connected) {
            if(roomId) {
                // ns.connected[id].rooms is an object!
                var rooms = Object.values(ns.connected[id].rooms);  
                var index = rooms.indexOf(roomId);
                if(index !== -1) {
                    res.push(ns.connected[id]);
                }
            }
            else {
                res.push(ns.connected[id]);
            }
        }
    }
    return res;
}
MoleIsKing
sumber
Anda tidak dapat membayangkan betapa sakitnya Anda telah menyelamatkan saya
nicholaswmin
tetapi versi socket.io belum 1,5! Sekarang sudah 1.4.8
leszek.hanusz
@MoleIsKing Obrigado amigo!
2

pada socket.io 1.3 saya telah menyelesaikan ini dalam 2 baris

var usersSocketIds = Object.keys(chat.adapter.rooms['room name']);
var usersAttending = _.map(usersSocketIds, function(socketClientId){ return chat.connected[socketClientId] })
Coelhone
sumber
2

Socket.io 1.7.3 (+):

fungsi getConnectedList ()
{
    let list = []
    
    untuk (biarkan klien di io.sockets.connected)
    {
        list.push (klien)
    }
    
    daftar kembali
}

console.log (getConnectedList ())

// mengembalikan ['yIfhb2tw7mxgrnF6AAAA', 'qABFaNDSYknCysbgAAAB']

Alexandre Daubricourt
sumber
2

Untuk versi 2.3 ini berfungsi dan itu akan membuat Anda mendapatkan soket juga , bagi saya sepertinya socketIo berubah terlalu cepat dan banyak dengan sedikit dokumentasi yang dapat dibaca setelah menggunakannya untuk sementara waktu.

ioSite.of('/').in(roomId).clients((error, clients) => {
    if (error) throw error;
    for (var i=0;i<clients.length;i++) {
        clientId=clients[i];
        console.log(clientId);

        // load the socket of your namespace
        var socket=ioSite.of('/').in(roomId).connected[clientId]
        console.log(socket.constructor.name);
        console.log(socket.id);
    }
});

masih ini terasa tidak benar, karena saya selalu merasa dengan socket Io entah bagaimana

Joris Ceelen
sumber
1
Saya mulai berpikir itu adalah perpustakaan sampah. Satu-satunya hal yang dilakukannya dengan benar mentransfer banyak jenis data (json, binary, dll) jika tidak seluruh arsitektur adalah omong kosong dan tidak berskala melebihi 1 pada 1 aplikasi obrolan
Muhammad Umer
1

Saya percaya Anda dapat mengakses ini dari properti manajer soket?

var handshaken = io.manager.handshaken;
var connected = io.manager.connected;
var open = io.manager.open;
var closed = io.manager.closed;
Dan Steele
sumber
Jawaban 3rdEden tidak bekerja untuk saya karena ada masalah dengan array mengembalikan klien terputus, yang membuang hitungan. Object.keys (io.manager.open). Panjang ternyata menjadi hitungan paling dapat diandalkan dalam pengalaman saya. io.of ('/ namespace'). manager.open jika Anda menggunakan namespaces.
Wes Johnson
1

Saya melihat banyak jawaban bagus di sini dan banyak di mana cukup berguna tetapi tidak cukup apa yang saya butuhkan. Saya menggunakan soket untuk fitur pubsub di mana klien yang tertarik dapat mendengarkan perubahan apa pun dalam catatan yang diberikan.

Masalah spesifik saya adalah soket yang sama bergabung dengan ruangan yang sama beberapa kali. Solusi untuk ini adalah untuk memeriksa apakah soket sudah memiliki ruangan di dalam properti kamarnya.

var room = myObj.id.toString();
if (socket.rooms.indexOf(room) === -1) {
    socket.join(room);
    socket.emit('subscribed', {to : room});
} else {
    console.log("Already in room");
}

Semoga ini bisa membantu seseorang.

Gus Ortiz
sumber
Saya pikir itu mungkin untuk menghindari pernyataan 'jika', jika Anda membuat klien bergabung dengan ruangan pada koneksi soket.
Chayemor
Dari mana myObj berasal? Bagaimana Anda sampai pada nilai itu?
Michael Draper
@MikeDraper myObject adalah catatan dalam database yang bertindak sebagai saluran. Apa yang dipecahkan ini adalah kasus di mana Anda ingin semua klien Anda diperbarui setiap kali terjadi perubahan dalam basis data, misalnya seorang pengguna memperbarui namanya dan semua klien yang terhubung mendapatkan pembaruan. Jadi saya membuat ruang untuk instance id itu, mengingat itu unik (BSON). Ini adalah nilai yang sangat spesifik untuk kasus penggunaan saya, jadi saya minta maaf jika saya menyebabkan kebingungan. Beri tahu saya jika Anda butuh bantuan :)
Gus Ortiz
@ JPR karena sifat aplikasi saya, kebetulan ada soket yang berlangganan lebih dari sekali, itu sebabnya saya harus menambahkan cek itu.
Gus Ortiz
1

Ini adalah cara paling sederhana di Socket.IO 1.0+, jika Anda tidak menggunakan ruang nama atau kamar.

io.nsps["/"].sockets.length

Ini terlihat pada namespace default dan menentukan panjang array soket, tanpa perlu menggunakan Object.keys()

suncannon
sumber
1

Pada versi 1.5.1, saya dapat mengakses semua soket di namespace dengan:

var socket_ids = Object.keys(io.of('/namespace').sockets);
socket_ids.forEach(function(socket_id) {
    var socket = io.of('/namespace').sockets[socket_id];
    if (socket.connected) {
        // Do something...
    }
});

Untuk beberapa alasan, mereka menggunakan objek biasa bukan array untuk menyimpan ID soket.

rppc
sumber
Yang ini berhasil. String kosong di io.of ('') berfungsi tanpa spasi nama.
Király István
@ KirályIstván Saya belum melihat ini untuk sementara waktu sekarang, tapi saya pikir Anda benar-benar dapat menghapus of()panggilan dirantai dalam kasus itu.
rppc
1

Untuk mode kluster, gunakan redis-adapter

io.in(<room>).clients(function(err, clients) {

});

Karena setiap soket itu sendiri adalah sebuah ruangan, maka orang dapat menemukan apakah sebuah soket menggunakan yang sama.

Anuj Nautiyal
sumber
0

Berikut ini adalah cara cepat untuk mengkonversi hash dari soket yang terhubung dari namespace menjadi array menggunakan generator ES6 (berlaku untuk socket.io> = v1.0.0):

io.on('connection', function(socket) {
  var hash = io.of('/').connected
  var list = null

  hash[Symbol.iterator] = function*() {
    // for..of loop to invoke Object.keys() default iterator
    // to get the array values instead of the keys
    for(var id of Object.keys(hash)) yield hash[id]
  }

  list = [...hash]
  console.log(Array.isArray(list)) // true
})
Morgan
sumber
0

Saya tidak tahu apakah ini masih berjalan. Tetapi sesuatu seperti inilah yang akhirnya saya gunakan (saya menyimpan objek sesi pada setiap soket yang terhubung, yang pada gilirannya berisi nama pengguna dan info lainnya:

var connectedUsers = Object.keys(io.sockets.connected).map(function(socketId) {
    return io.sockets.connected[socketId].session.username;
});
diazd2
sumber
0

Jika proyek memiliki cluster socket.io ini berarti adapter socket.io-redis sedang digunakan.

Jika case seperti di atas, mendapatkan proses id semua soket yang terhubung harus diterapkan melalui adaptor socket.io-redis . Contoh di bawah ini dapat digunakan untuk ini;

io.of('/').adapter.clients(function (err, clients) {
  console.log("clients: ", clients); // an array containing all connected socket ids
});


io.of('/').adapter.allRooms(function (err, rooms) {
  console.log("all rooms: ", rooms);
});

Silakan kunjungi halaman socket.io-redis github untuk lebih jelasnya.

efkan
sumber
0

[email protected]

Saya menggunakan Object.Keys untuk menghubungkan array soket. Kemudian dalam larik yang sama iterate dengan fungsi peta untuk membangun larik objek baru

var connectedUsers = Object.keys(io.sockets.connected).map(function(socketId) {
    return { socket_id : socketId, socket_username: io.sockets.connected[socketId].username };
});

// test
console.log(connectedUsers);

Mungkin jawaban ini dapat membantu mendapatkan soket id / nama pengguna array.

jvaldezb
sumber
1
Hai - dapatkah Anda menjelaskan dalam bahasa Inggris bagaimana cara mengatasi masalah ini? Dengan cara ini, itu bukan jawaban yang hanya berupa kode. Terima kasih!
Max von Hippel
0

v.10

var clients = io.nsps['/'].adapter.rooms['vse'];
/* 
'clients' will return something like:
Room {
sockets: { '3kiMNO8xwKMOtj3zAAAC': true, FUgvilj2VoJWB196AAAD: true },
length: 2 }
*/
var count = clients.length;  // 2
var sockets = clients.map((item)=>{  // all sockets room 'vse'
       return io.sockets.sockets[item];
      });
sample >>>
var handshake  = sockets[i].handshake; 
handshake.address  .time .issued ... etc.
Ark Iv
sumber
1
Akan lebih baik jika Anda dapat menambahkan beberapa konteks mengapa 'Ini adalah cara terbaik' dan bagaimana jawaban Anda menambahkan sesuatu ke semua jawaban di atas. Kode adalah sesuatu, tetapi jawaban juga harus memiliki penjelasan. Seperti yang Anda lihat ada banyak jawaban lain untuk pertanyaan ini. Jawaban Anda harus membawa sesuatu lebih ke subjek, jika tidak, itu berlebihan.
Nathan Ripert
Dengan socket.io 2.1.1 , saya dapat TypeError: clients.map is not a functiondan meskipun terlihat menjanjikan, saya tidak sepenuhnya yakin apa yang akan dicapai contoh di atas - saya berharap akan secara otomatis membuat array objek klien dengan nama pengguna termasuk :).
user1063287