我有一个简单的聊天室应用程序,使用节点快速服务器。这将使用 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 中的收盘事件?