socket io如何将事件发送给好友?

嗨,我正在与节点js聊天,我有一个问题。 聊天是全球性的,没有房间,但用户只能看到和写在他们的好友列表中的用户。 所以当他们连接到服务器时,他们也会发送用户ID和好友列表作为数组。 在服务器我有一个全球variables与在线用户。 现在,哪一个最好的方式把事件发布给好友列表中的用户呢?

这是我现在的代码:

var express = require('express'); var cors = require('cors'); var crypto = require('crypto'); var app = express(); var port = process.env.PORT; var mongoose = require('mongoose'); var jwt = require('jsonwebtoken'); var socketio = require('socket.io'); var confdb = require('./lib/config-db.js'); var conf = require('./lib/config.js'); var db = require('./lib/chat-db'); var whitelist = []; var secret_st = ''; var chrlimit = ''; var socketio_jwt = require('socketio-jwt'); var uidlist = {}; var id = {}; var mongodburl = process.env.MONGODB_URI; // initialize db =============================================================== mongoose.connect(mongodburl); // connect to our database mongoose.Promise = global.Promise; // set up our express application confdb.findOne({'check': '1'}).exec(function(err, docs){ if (docs) { whitelist = docs.origin; secret_st = docs.spku; chrlimit = docs.chrlimit; if (docs.badwld) { badwl = JSON.parse(docs.badwld); } } else { conf.saveconfig(); } startall(); }); function startall() { var corsOptions = { origin: function(origin, callback){ var originIsWhitelisted = whitelist.indexOf(origin) !== -1; callback(null, originIsWhitelisted); } }; app.use(cors(corsOptions), function(req, res, next) { next(); }); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); // launch ====================================================================== var server = app.listen(port); var io = socketio.listen(server); //Routes ====================================================== app.get('/', function(req, res) { res.writeHead(200); res.end(); }); var nspm = io.of('/member'); nspm.use(socketio_jwt.authorize({ secret: secret_st, handshake: true })); nspm.on('connection', function(socket) { db.c_oneusr(socket.decoded_token, function(err, docs){ nspm.to(socket.id).emit('ckusr', 'ok'); initializeConnection(socket, 0); }); }); function initializeConnection(socket, lstshout){ showActiveUsers(socket, lstshout); } function showActiveUsers(socket, lstshout){ socket.uid = socket.decoded_token.uid; uidlist[socket.uid] = 1; if (!id[socket.uid]) { id[socket.uid] = {}; } if (!msgtime[socket.uid]) { msgtime[socket.uid] = []; } msgtime[socket.uid]['lpmsgt'] = lstshout; id[socket.uid][socket.id] = 1; socket.emit('login', { uidlist: uidlist }); // I need to change this and emit it only to buddies socket.broadcast.emit('user joined', { uidlist: uidlist, uid: socket.uid }); data = []; data["uid"] = socket.decoded_token.uid; data["id"] = socket.id; data["buddies"] = socket.decoded_token.buddies; db.updpml(data); } }