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

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


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
    // 验证用户token
    let 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;
    
        await next();
    } 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.js
const Controller = require('egg').Controller;
class ChatController extends Controller {
    // 连接socket
    async connect() {
        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;


目录
相关文章
|
1月前
uni-app 65egg.js聊天类chat.js封装(二)
uni-app 65egg.js聊天类chat.js封装(二)
30 1
|
1月前
|
开发框架 移动开发 JavaScript
uni-app 68 egg.js发送消息接口开发-单聊(一)
uni-app 68 egg.js发送消息接口开发-单聊(一)
|
11天前
|
存储 移动开发 JavaScript
uni-app 64聊天类chat.js封装(一)
`uni-app` 是一个使用 Vue.js 开发所有前端应用的框架,可以编译到iOS、Android、H5以及各种小程序等多个平台。当你提到“64聊天类`chat.js`封装”时,我假设你希望了解如
|
22天前
|
前端开发 JavaScript 中间件
基于最新koa的Node.js后端API架构与MVC模式
基于最新koa的Node.js后端API架构与MVC模式
31 1
|
22天前
|
JavaScript 前端开发 NoSQL
构建基于Node.js的全栈应用:从前端到后端的完整指南
【5月更文挑战第24天】本文是关于使用Node.js构建全栈应用的指南,涵盖前端(React或Vue)、后端(Node.js + Express)和数据库(MongoDB)的选型与实现。文章介绍了项目结构、前端组件化开发、后端API接口编写、前后端联调及部署上线的注意事项,帮助读者掌握全栈开发流程。
|
1月前
|
移动开发 JavaScript 前端开发
uni-app和Vue.js二者之间有什么区别?
1. uni-app是一个使用Vue.js开发所有前端应用的框架,支持一次编译多端运行。开发者编写的基础代码只需进行一次编写,就可以发布到多个平台,包括App、H5、微信小程序等。 2. Vue.js是一个渐进式JavaScript框架,用于构建用户界面。与其他大型框架不同的是,Vue被设计为可以自底向上逐层应用。
14 0
|
1月前
|
JavaScript 前端开发 IDE
【TypeScript技术专栏】TypeScript与Node.js后端开发
【4月更文挑战第30天】TypeScript在Node.js后端开发中日益重要,作为JavaScript超集,它提供静态类型检查和面向对象编程,增强代码可靠性和维护性。集成TypeScript能带来类型安全、更好的IDE体验、易于维护的代码以及增强工具支持。通过安装TypeScript编译器、编写TypeScript文件、配置TSconfig,开发者可以在Node.js项目中利用其高级特性,提高代码质量和开发效率。实践案例显示,TypeScript能确保路由处理器的类型正确,降低错误率。随着社区发展,TypeScript成为提升Node.js开发体验的推荐选择。
|
1月前
|
JSON JavaScript 前端开发
Node.js:前端开发的后端利器
Node.js作为一种运行在服务器端的JavaScript环境,为前端开发者打开了后端开发的大门。它以其高效的事件驱动、非阻塞I/O模型以及强大的npm生态,使得前端开发者能够轻松构建服务器端应用,实现前后端的全栈开发。本文将探讨Node.js的核心优势、应用场景以及在前端开发中的重要性。
|
1月前
uni-app 68 egg.js发送消息接口开发-单聊(一)
uni-app 68 egg.js发送消息接口开发-单聊(一)
29 7
|
1月前
uni-app 66聊天类chat.js封装(三)
uni-app 66聊天类chat.js封装(三)
47 6