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,) => {
// 获取参数 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,) => {
// 用户下线
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;