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);// websocketapp.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();}// 记录当前用户idctx.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 {// 连接socketasync connect() {const { ctx, app } = this;if (!ctx.websocket) {ctx.throw(400,'非法访问');}// console.log(`clients: ${app.ws.clients.size}`);// 监听接收消息和关闭socketctx.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;

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

  1. SpringSecurity(八)用户数据获取之SpringSecurityContextHolder深度剖析(下)

    在上一篇中我们大致的说明了从Security中获取登录数据的逻辑以及SecurityContextHolder保存数据的策略,最后也遗留下了一个问题.-SpringBoot中不同的请求都是由不同的线程 ...

  2. uni app 开发微信小程序及上线体验

    uni app 开发微信小程序及上线体验 项目创建及微信小程序AppId的申请 本次开发的是电商类的微信小程序,这里用到的是HBuilderX这个编辑器.之前用的Visual Studio Code ...

  3. 记录uni.app开发微信小程序中地图的使用,以及项目中的解决办法

    标题先讲一下需求:需要获取用户的地址信息以及经纬度,并在地图中展示时出来 uniapp官方也提供了api uni.getLocation(OBJECT) getLocation只能获取用户的经纬度,不 ...

  4. uni app和php开发微信登录代码,uniapp如何实现微信授权登录

    uniapp实现微信授权登录的方法:首先获取对应的appid和appsecret:然后在uniapp项目的manifest.json中进行APP SDK配置和模块权限配置.最后实现编码. 本教程操作环 ...

  5. [css] 除了可以用js跟踪用户信息外,如果不用js,使用纯css怎么做呢?

    [css] 除了可以用js跟踪用户信息外,如果不用js,使用纯css怎么做呢? 可以利用 css 的伪类 :hover :active :focus 之类的监听用户行为,然后给指定的url 发送请求. ...

  6. 新浪微博回应热搜被暂停更新一周;即刻 APP 下架一年后恢复上线;Android 11 Beta 版发布| 极客头条...

    整理 | 屠敏 头图 | CSDN 下载自东方 IC 快来收听极客头条音频版吧,智能播报由出门问问「魔音工坊」提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极 ...

  7. 如何使用node.js后端框架中的egg.js框架

    安装egg 我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目(npm >=6.1.0): mkdir egg-example && cd egg-example npm ...

  8. uni.app H5(微信公众号定位) uni.getLocation

    最近在开发公众号,由于之前经常使用uni,app写APP,索性就用uni.app来开发公众号了, 不过也遇到了一个问题,就是在公众号的首页要获取用户的定位.我看了看官网的API 有个uni.getLo ...

  9. 移动App该怎样保存用户password

    版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/34623957 ...

最新文章

  1. 【Win32 API学习]打开可执行文件
  2. 标准博客 API .BLOG APIS
  3. cmake简明使用指南
  4. 奇门对接需求设计_从2020《奇门遁甲》看网络电影精品化的“正确打开方式”...
  5. iptables用法简介
  6. u盘安装linux系统自动关机,将u盘拔出后电脑自动关机怎么解决【解决方法】
  7. metrics-server 安装问题解决
  8. 数字转换星期几python_Python基本时间转换
  9. 前端学HTTP之网络基础
  10. 华为机试真题 C++ 实现【竖直四子棋】
  11. 排球积分程序功能说明书
  12. 淘宝买家秀后台操作与各场景展示逻辑
  13. “多事之秋”的趣店,如今还好吗?
  14. 使用友盟进行app的增量更新
  15. 如果有人再问你 Java IO,把这篇文章砸他头上
  16. 计算机设备标签怎么贴,电脑怎么打印不干胶标签 电脑打印不干胶标签操作流程【图文】...
  17. DEVOPS:统一DEV、OPS和QA
  18. swift实战-豆瓣电台
  19. 模板字符串(` `)
  20. 万能计算机作文,万能机器人作文9篇

热门文章

  1. 如何在大学期间提高英语能力
  2. 学生考勤管理系统php,php158 学生考勤管理系统
  3. 智慧城市系列课程4-智慧城市-城市治理-新能源火灾和水务监管
  4. Python - 多继承与MRO
  5. 麻将服务器回放消息定义,腾讯欢乐麻将怎么看回放?怎么看好友历史战绩记录...
  6. [Unity] C#使用委托和事件实现Unity消息中心(观察者模式)
  7. [音乐]Pink Floyd - The Great gig of the sky
  8. K8S安装Jumpserver
  9. 简述3种CQRS架构模式
  10. 不同施肥类型导致产量不同--SPSS 单因素方差分析