【问题标题】:How to maintain users socketid in nodejs?nodejs中如何维护用户socketid?
【发布时间】:2018-03-09 18:10:42
【问题描述】:

我是 nodejs 的新手,所以可能这个问题听起来很奇怪,但我需要的是我想创建一个聊天应用程序,让用户登录,然后他们可以一对一或一对多聊天,但问题是如果用户刷新浏览器那么我如何维护我在服务器端维护的用户列表的套接字 ID 这是我使用的代码

服务器端

var app = require('express')();
var fs = require('fs');
var forceSsl = require('express-force-ssl');

app.use(forceSsl);
var options = {
    key: fs.readFileSync('server.key'),
    cert: fs.readFileSync('server.crt')
};
var server = require('https').createServer(options, app).listen(3000,function(){
        console.log("Https server started on port 3000");
});
var io = require('socket.io').listen(server);


var sockets = {}; 
var users = {};
io.on('connection', function(socket)
{
    console.log("Hi i am connected"); 
    // Emit the connected users when a new socket connects 
    for (var i in sockets) 
    { 
        socket.emit('user.add', { username: sockets[i].username, id: sockets[i].id  });    
    }    
    // Add a new user 
    socket.on('username.create', function (data) 
    { 
        socket.username    = data; 
        sockets[socket.id] = socket; 
        users[data]        = socket.id;
        io.emit('user.add',{ username: socket.username, id: socket.id }); 
    });    
    // Send the hug event to only the socket specified 
    socket.on('pm', function (data) 
    { 
         io.to(users[data.username]).emit('message', data.message);    
    }); 
    // Remove disconnected users 
    socket.on('disconnect', function () 
    { 
        delete sockets[socket.id]; io.emit('user.remove', socket.id);    
    }); 
});

客户端

socket.emit('username.create', results.email);

socket.on("message", function(data) {
            //here i want to display message who send to this user
        });



        $(document).on('click','#gotou',function() 
        {
            var sendto  = $("#msgto").val();
            socket.emit("pm", {"username":sendto,"message":"Testing from "+checkusername}); 
        });   

【问题讨论】:

标签: node.js socket.io


【解决方案1】:

您可以在数组中维护套接字 id。您需要使用 userId 调用第一个 checkIn 事件以使用 userid 保存套接字 id。 这是一个例子

var socketids=[];
io.on('connection', function(socket)
{
socket.on('checkedIn', function (data) 
socketids[socket.id]=data.userId
})

})

【讨论】:

  • 什么是浏览器刷新,我该如何维护用户列表?
  • 那么它总是存储你当前更新的套接字 ID
  • @OsamaBari 仅当您在一个浏览器的一个选项卡中打开客户端时,它才会起作用。如果同一用户在不同的浏览器中,我们需要维护一个数组。
【解决方案2】:

经过一番研究,我发现有很多npm package可以用来存储Socket.IO的会话ID:

  1. socket.io-sessions
  2. cookie-session

Cookie-parser and express-session come inside express package before express 4.0

检查一下,中间件 npm 包它可以帮助您解决问题。

Middleware between express-session and socket.io

适用于 express > 4.0.0socket.io > 1.0.0,但不会落后 兼容。

例子:

var app = require('express')(),
  server  = require("http").createServer(app),
  io = require("socket.io")(server),
  session = require("express-session")({
    secret: "my-secret",
    resave: true,
    saveUninitialized: true
  }),
  sharedsession = require("express-socket.io-session");


// Attach session
app.use(session);

// Share session with io sockets

io.use(sharedsession(session));

io.on("connection", function(socket) {
    // Accept a login event with user's data
    socket.on("login", function(userdata) {
        socket.handshake.session.userdata = userdata;
        socket.handshake.session.save();
    });
    socket.on("logout", function(userdata) {
        if (socket.handshake.session.userdata) {
            delete socket.handshake.session.userdata;
            socket.handshake.session.save();
        }
    });        
});

server.listen(3000);

注意 - 我没有测试它。这所有的包都是在服务器端实现的。

或者如果你不想使用这个npm package 那么:

您可以将套接字 id 检索到变量中并将其设置为 angular-local-storage。所以angular-local-storage刷新页面后也保存。

示例 -

localStorageService.set('id', socketid);

【讨论】:

  • 我在前端使用 angularjs,我只需要 nodejs 和 socket.io 来进行聊天系统,那么您有什么合适的解决方案来解决我的问题吗?
  • 所以你不想使用任何其他npm package ?
  • 不,使用任何其他软件包都没有问题,但是如果您为此提供帮助,我如何在客户端使用这是主要问题
  • 这个东西会被添加到客户端吧?那么如何在节点的服务器端维护
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2013-11-25
  • 2013-11-27
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多