如何在 nodejs 服务器断开连接时清除 redis 数据库



我有一个简单的聊天室应用程序,使用节点快速服务器。这将使用 redis 数据库连接来存储已加入客户端的昵称。

我需要在服务器关闭/断开连接时清除名为 members 的 redis 昵称集。这可以按如下方式完成:

redisClient.del("members", function(err, reply){
    console.log("members set delete :" + reply);
});

但是我应该把这段代码放在哪里呢?断开连接时,如何处理来自服务器的最终事件,从服务器端?

服务器代码 - 聊天室.js

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var redis = require('redis');
var redisClient = redis.createClient();
io.on('connection', function(client){
    console.log("client connected...");
});
io.on('connection', function(client){
    client.on('join', function(name){
        client.nickname = name;
        //adding names
        client.broadcast.emit("add member", name);
        redisClient.smembers('members', function(err, names) {
            names.forEach(function(name){   
                client.emit('add member', name);    
            }); 
        });
        client.emit('add member', client.nickname)
        redisClient.sadd("members", name);
    });
    // remove clients on disconnect
    client.on('disconnect', function(name){
        client.broadcast.emit("remove member", client.nickname);
        redisClient.srem("members", client.nickname);   
    });
});
app.get('/', function(req, res){
    res.sendFile(__dirname + '/views/index.html');
});
server.listen(8080);

客户端代码 - views/index.html

<html>
    <head>
        <title>Socket.io Client</title>
        <script src="/socket.io/socket.io.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    </head>
    <body>
        <h2>Chat box</h2><br>
        <h4 id="status"></h4><br>
        <div>
            <h3>Active members</h3>
            <ul id="members"></ul>
        </div>
        <script>
            var socket = io.connect('http://localhost:8080');
            socket.on('connect', function(data){
                nickname = prompt("What is your nickname?");
                $('#status').html('Connected to Chat Room as ''+nickname+''.');        
                socket.emit('join', nickname);
            });
            socket.on('add member', function(name) {
                var member = $('<li>'+name+'</li>').data('name', name);
                $('#members').append(member);   
            });
            socket.on('remove member', function(name) {
                $('#members li').filter(function() { return $.text([this]) === name; }).remove();   
            });
            socket.on('disconnect', function(data){
                $('#status').html('Chatroom Server Down!');        
            });
        </script>
    </body>
</html>

当 nodejs 服务器断开连接时,如何清除 redis 数据库集?

您可以在 redisclient 上使用错误结束事件,请查看 Redis 包文档

redisClient.on("error", function (err) {
      console.log("Error " + err)
      // delete here
});

但是,由于您的连接已关闭,因此每次在首次连接到 redis 时删除会更健康。 在重新连接状态下也这样做。

当 socket.io 连接终止时,将触发名为 disconnect 的事件。将重置逻辑注册到该回调。

io.sockets.on('connection', function (socket) {
  socket.on('disconnect', function () {
    redisClient.del("members", function(err, reply){
    console.log("members set delete :" + reply);
    });
  });
});

积分 : 如何处理 Socket.io 中的收盘事件?

相关内容

  • 没有找到相关文章

最新更新