关于个人全栈项目【臻美Chat】遇到的BUG以及解决方法

傷城~ 2021-08-13 22:58 404阅读 0赞

项目展示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

问题总结:

一、单用户重复登录设备

将每次输入的用户名与已经记录在后台的数组ar比较,如果存在则表示重复。

  1. // 生成数组
  2. var ar="";
  3. socket.on('array', function (val) {
  4. ar = val;
  5. // console.log(ar);
  6. });
  7. if(ar.indexOf(lo.value)==-1){
  8. sweetAlert("恭喜您,登录成功!");
  9. socket.emit('setName', lo.value.trim());
  10. names1(lo.value.trim());
  11. login1.style.display="none";
  12. document.querySelector(".bg").style.display = "none";
  13. document.querySelector(".cd span").style.display = "none";
  14. document.querySelector(".title img").style.display = "block";
  15. document.querySelector(".fix").style.display = "block" ;
  16. document.querySelector(".title").style.display = "block" ;
  17. document.querySelector(".tit").innerText=lo.value.trim();
  18. document.querySelector(".swal-button").onclick = function () {
  19. document.getElementById("text").focus();
  20. document.querySelector(".fix").addEventListener('click', function (e) {
  21. if (e.target.nodeName === "LI"&&e.target.innerText != document.querySelector(".tit").innerText) {
  22. document.querySelector(".fix").style.display="none";
  23. document.querySelector(".chat_b").style.display="block";
  24. document.querySelector(".box").style.display="block";
  25. document.querySelector(".tit").innerText = e.target.innerText;
  26. document.querySelector("#text").focus();
  27. onOff=true;
  28. }
  29. else{
  30. sweetAlert("不能跟自己聊天哦~");
  31. }
  32. })
  33. }
  34. }
  35. else{ sweetAlert("不能重复登录哦!"); return }

二、不能跟自己聊天

判断点击是否是同一个信息

  1. if (e.target.nodeName === "LI"&&e.target.innerText != document.querySelector(".tit").innerText) {
  2. document.querySelector(".fix").style.display="none";
  3. document.querySelector(".chat_b").style.display="block";
  4. document.querySelector(".box").style.display="block";
  5. document.querySelector(".tit").innerText = e.target.innerText;
  6. document.querySelector("#text").focus();
  7. onOff=true;
  8. }
  9. else{
  10. sweetAlert("不能跟自己聊天哦~");
  11. }

三、不使用ajax,不使用数据库,怎么传值,怎么保存信息

可以使用socket.emit()发送到后台,
然后socket.on()监听。

  1. // 传名
  2. function names(value) {
  3. this.name=value;
  4. socket.emit("reg", name);
  5. }
  6. function names1(value) {
  7. this.name1 = value;
  8. socket.emit("join", name1);
  9. document.title = name1 + "的臻美Chat"
  10. }
  11. // 传密码
  12. function pass(value){
  13. socket.emit("pass", value);
  14. }
  15. socket.on("join", function (user) {
  16. this.na = user;
  17. })
  18. socket.on("reg", function (user) {
  19. this.na1 = user;
  20. })
  21. socket.on("pass", function (val) {
  22. // console.log(val);
  23. })
  24. // 监听后台名
  25. var users2 = "";
  26. socket.on('users', function (users) {
  27. users2 = users;
  28. // console.log(users2);
  29. });
  30. // 监听后台密码
  31. var pass2=""
  32. socket.on('pass', function (val) {
  33. pass2 = val;
  34. // console.log(pass2)
  35. });

前台传进来的数据通过写入文件的方式保存。

  1. //名字
  2. socket.on("reg", function (name) {
  3. usocket[name] = socket;
  4. this.i1=name;
  5. io.emit("reg", name);
  6. var myname =this.i1+"\n";
  7. fs.writeFile('./user.xls', myname, {
  8. 'flag': 'a'
  9. }, function (err) {
  10. if (err) {
  11. throw err;
  12. }
  13. // 写入成功后读取测试
  14. fs.readFile('./user.xls', 'utf-8', function (err,data) {
  15. if (err) {
  16. throw err;
  17. }
  18. });
  19. });
  20. })
  21. // 密码
  22. socket.on("pass",function(val){
  23. pass[val]=socket;
  24. this.i2=val;
  25. io.emit("pass", val);
  26. var password=this.i2+"\n";
  27. fs.writeFile('./password.xls', password, {
  28. 'flag': 'a'
  29. }, function (err) {
  30. if (err) {
  31. throw err;
  32. }
  33. });
  34. })

四、怎么实现私发消息

给每个用户提供生成私有socket

  1. // 获取在线
  2. function broadcast() {
  3. io.sockets.emit("dataval", hashName);
  4. }
  5. //提供私有socket
  6. function privateSocket(toId) {
  7. return (_.findWhere(io.sockets.sockets, {
  8. id: toId
  9. }));
  10. }
  11. // 封装删除
  12. function removeByValue(arr, val) {
  13. for (var i = 0; i < arr.length; i++) {
  14. if (arr[i] == val) {
  15. arr.splice(i, 1);
  16. break;
  17. }
  18. }
  19. }
  20. // 连接socket
  21. var io=ws(server);
  22. io.on("connection",function(socket){
  23. // 写入成功后读取测试
  24. fs.readFile('./user.xls', 'utf-8', function (err, data) {
  25. if(data!=null){
  26. var value = data.split('\n');
  27. io.sockets.emit("users", value);
  28. }
  29. });
  30. // 写入成功后读取测试
  31. fs.readFile('./password.xls', 'utf-8', function (err,data) {
  32. if(data!=null){
  33. var pass1=data.split('\n');
  34. io.sockets.emit("pass", pass1);
  35. }
  36. });
  37. broadcast();
  38. // 生成名字
  39. socket.on('setName', function (data) {
  40. var name = data;
  41. hashName[name] = socket.id;
  42. // console.log(hashName[name]);
  43. broadcast();
  44. });
  45. // 私聊发送
  46. socket.on('sayTo', function (data) {
  47. var toName = data.to;
  48. var toId;
  49. console.log(toName);
  50. if (toId = hashName[toName]) {
  51. privateSocket(toId).emit('message1', data);
  52. }
  53. });

五、当两个以上用户同时登录出现用户列表被清空,实现实时更新列表

使用数组去重,每次捕捉在线的用户,重新赋值

  1. // 统计在线人数
  2. var arrh=[]
  3. socket.on('dataval', function (val) {
  4. vf = val;
  5. console.log(vf);
  6. for (let i = 0; i < vf.length; i++) {
  7. // uu++
  8. arrh.push(vf[i])
  9. console.log(arrh)
  10. }
  11. var rf = [...new Set(arrh)]
  12. console.log(rf)
  13. rf=vf
  14. for (let j = 0; j < rf.length; j++) {
  15. var li = document.createElement("li");
  16. li.classList.add("active");
  17. li.innerText = rf[j]
  18. console.log(rf[j])
  19. socket.emit("time", rf[j]);
  20. document.querySelector(".fix").appendChild(li);
  21. }
  22. });
  23. socket.on('join', function (val) {
  24. document.querySelector(".fix").innerHTML = ''
  25. })
  26. socket.on('disconnect', function (val) {
  27. document.querySelector(".fix").innerHTML = ''
  28. })

六、离线发送消息

手机端切换后台有效,熄屏无效。

  1. function sock () {
  2. return io.connect("localhost:3003");
  3. }
  4. // 心跳机制
  5. document.addEventListener('visibilitychange',function() {
  6. if(document.visibilityState == 'hidden') {
  7. //记录页面隐藏时间
  8. var hiddenTime = new Date().getTime()
  9. setTimeout(function(){
  10. io.connect("localhost:3003");
  11. },1500);
  12. } else {
  13. var visibleTime = new Date().getTime();
  14. //页面再次可见的时间-隐藏时间>3S,重连
  15. if((visibleTime - hiddenTime) / 1000 > 3){
  16. // 主动关闭连接
  17. // console.log('我要断开')
  18. io.disconnect()
  19. // 1.5S后重连 因为断开需要时间,防止连接早已关闭了
  20. setTimeout(function(){
  21. io.connect("localhost:3003");
  22. },1500);
  23. }else{
  24. console.log('还没有到断开的时间')
  25. }
  26. }
  27. })
  28. var socket = sock()

发表评论

表情:
评论列表 (有 0 条评论,404人围观)

还没有评论,来说两句吧...

相关阅读