uni-app 63egg.js后端用户上线和下线深度剖析

2022年6月25日13:15:33

router.js

'use strict';/**
 * @param {Egg.Application} app - egg application
 */
module.exports=app=>{const{ router, controller}= app;
  router.get('/', controller.home.index);// 用户注册
  router.post('/reg',controller.user.reg);// 登录
  router.post('/login',controller.user.login);// 退出登录
  router.post('/logout',controller.user.logout);// 搜索用户
  router.post('/search/user',controller.search.user);// 申请添加好友
  router.post('/apply/addfriend',controller.apply.addFriend);// 获取好友申请列表
  router.get('/apply/:page',controller.apply.list);// 处理好友申请
  router.post('/apply/handle/:id',controller.apply.handle);// 通讯录好友申请
  router.get('/friend/list',controller.friend.list);// 查看好友资料
  router.get('/friend/read/:id',controller.friend.read);// 移入/移除黑名单
  router.post('/friend/setblack/:id', controller.friend.setblack);// 设置/取消星标好友
  router.post('/friend/setstar/:id', controller.friend.setstar);// 设置朋友圈权限
  router.post('/friend/setmomentauth/:id', controller.friend.setMomentAuth);// 举报投诉好友/群组
  router.post('/report/save', controller.report.save);// 设置好友备注和标签
  router.post('/friend/setremarktag/:id',controller.friend.setremarkTag);// websocket
  app.ws.route('/ws', controller.chat.connect);
  
  app.ws.use(async(ctx, next)=>{// 获取参数 ws://localhost:7001/ws?token=123456// ctx.query.token// 验证用户tokenlet user={};let token= ctx.query.token;try{
        user= ctx.checkToken(token);// 验证用户状态let userCheck=await app.model.User.findByPk(user.id);if(!userCheck){
            ctx.websocket.send(JSON.stringify({
                msg:"fail",
                data:'用户不存在'}));return ctx.websocket.close();}if(!userCheck.status){
            ctx.websocket.send(JSON.stringify({
                msg:"fail",
                data:'你已被禁用'}));return ctx.websocket.close();}// 用户上线
        app.ws.user= app.ws.user? app.ws.user:{};// 下线其他设备if(app.ws.user[user.id]){
            app.ws.user[user.id].send(JSON.stringify({
                msg:"fail",
                data:'你的账号在其他设备登录'}));
            app.ws.user[user.id].close();}// 记录当前用户id
        ctx.websocket.user_id= user.id;
        app.ws.user[user.id]= ctx.websocket;awaitnext();}catch(err){
            console.log(err);let fail= err.name==='TokenExpiredError'?'token 已过期! 请重新获取令牌':'Token 令牌不合法!';
            ctx.websocket.send(JSON.stringify({
                msg:"fail",
                data: fail}))// 关闭连接
            ctx.websocket.close();}});};

chat.js

// app/controller/chat.jsconst Controller=require('egg').Controller;classChatControllerextendsController{// 连接socketasyncconnect(){const{ ctx, app}=this;if(!ctx.websocket){
            ctx.throw(400,'非法访问');}// console.log(`clients: ${app.ws.clients.size}`);// 监听接收消息和关闭socket
        ctx.websocket.on('message',msg=>{// console.log('接收消息', msg);}).on('close',(code, reason)=>{// 用户下线
            console.log('用户下线', code, reason);let user_id= ctx.websocket.user_id;if(app.ws.user&& app.ws.user[user_id]){delete app.ws.user[user_id];}});}}
module.exports= ChatController;
  • 作者:2019ab
  • 原文链接:https://blog.csdn.net/ab15176142633/article/details/120377879
    更新时间:2022年6月25日13:15:33 ,共 2526 字。