socket io如何向好友发出事件?

时间:2017-07-17 15:08:08

标签: javascript ios node.js sockets io

您好我正在与节点js聊天,我有一个问题。聊天是全球性的,没有房间,但用户只能在他们的好友列表中查看和写入用户。因此,当他们连接到服务器时,他们还会将用户ID和好友列表作为数组发送。在服务器中,我有一个在线用户的全局变量。现在,哪个是向好友列表中的用户发送事件的最佳方式?

这是我目前的代码:

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

0 个答案:

没有答案