【问题标题】:How to clear redis database when nodejs server disconnect?nodejs服务器断开连接时如何清除redis数据库?
【发布时间】:2018-01-12 06:56:19
【问题描述】:

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

当服务器关闭/断开连接时,我需要清除名为members 的昵称的redis SET。 这可以通过以下方式完成:

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

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

服务器代码 - chatroom.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数据库集?

【问题讨论】:

    标签: node.js express redis socket.io event-handling


    【解决方案1】:

    你可以在redisclient上使用errorend事件,查看Redis Package Documentation

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

    但是,由于您的连接已关闭,因此每次与 redis 的第一个连接时删除更健康。也可以在重新连接状态下进行。

    【讨论】:

      【解决方案2】:

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

      致谢:How can i handle Close event in Socket.io?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        相关资源
        最近更新 更多