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;