socket在egg中的使用实例代码详解


Posted in Javascript onMay 30, 2019

config/config.default.js

exports.io = {
 init: {},
 namespace: {
  '/': {  //对应router.js里的 of('/')
  connectionMiddleware: [ 'auth' ], //对应io/middleware/auth
  packetMiddleware: [ 'filter' ],
  },
 },
 };

 config/plugin.js

exports.io = {
 enable: true,
 package: 'egg-socket.io',
};

 router.js

io.of('/').route('chat', io.controller.chat.index);
 io.of('/').route('message', io.controller.chat.message);
 io.of('/').route('user:online', io.controller.chat.online);

 app/io

app/io/middleware/auth.js

/**
 * Created by bear on 2018/2/12.
 */
const PREFIX = 'room'; //定义房间号

module.exports = app => {
 return async (ctx, next) => {
 const { app, socket, logger, helper } = ctx;
 const id = socket.id;
 const nsp = app.io.of('/');
 const query = socket.handshake.query;

 // 用户信息
 const { room, userId } = query; //获取socket链接传过来的参数
 const rooms = [ room ];

 console.log(room, userId);

 const tick = (id, msg) => {
  logger.debug('#tick', id, msg);
  // 踢出用户前发送消息
  socket.emit(id, helper.parseMsg('deny', msg));
  // 调用 adapter 方法踢出用户,客户端触发 disconnect 事件
  nsp.adapter.remoteDisconnect(id, true, err => {
  logger.error(err);
  });
 };
 // 检查房间是否存在,不存在则踢出用户
 // 备注:此处 app.redis 与插件无关,可用其他存储代替
 
 const hasRoom = await app.redis.get(`${PREFIX}:${room}`);
 console.log(hasRoom,`${PREFIX}:${room}`)

 // if (!hasRoom) {
 // tick(id, {
 //  type: 'deleted',
 //  message: 'deleted, room has been deleted.',
 // });
 // return;
 // }

 // 用户加入
 logger.debug('#join', room);
 socket.join(room);

 // 在线列表
 nsp.adapter.clients(rooms, (err, clients) => {
  // 更新在线用户列表
  nsp.to(room).emit('online', {
  clients,
  action: 'join',
  target: 'participator',
  message: `User(${id}) joined.`,
  });
  console.log(123,clients)
 });
 // socket.emit('connect', 'packet received!');
 
 await next();
 console.log('disconnect!');

 };
};

 app/io/middleware/filter.js

module.exports = (app) => {
 return async (ctx, next) => {
  // console.log(ctx.packet);
  await next();
  // console.log('packet response!');
 };
};

app/io/controller/chat.js

/**
 * Created by bear on 2018/2/12.
 */
module.exports = app => {
 class chatController extends app.Controller {
 async index() {
  this.ctx.socket.emit('res', 'test');
 }
 async message() { //方法通过 客户端 this.emit('message',{})//触发
  this.ctx.socket.emit('message', 'test');
  const params = this.ctx.args[0];
  // this.ctx.service.message.sendPeerMessage(params);
  console.log(2,params);
 }


 async online() {// modelMessage.sendOfflineMessage(socket, data.userId);
 }
 }
 return chatController;
};

总结

以上所述是小编给大家介绍的socket在egg中的使用实例代码详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
Apr 25 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
Jul 15 Javascript
jQuery父级以及同级元素查找介绍
Sep 04 Javascript
jquery实现tr元素的上下移动示例代码
Dec 20 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
May 13 Javascript
javascript 应用小技巧方法汇总
Jul 05 Javascript
ionic实现滑动的三种方式
Aug 27 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
Sep 14 Javascript
React利用插件和不用插件实现双向绑定的方法详解
Jul 03 Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 Javascript
深入了解JavaScript 私有化
May 30 #Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 #jQuery
Vue CL3 配置路径别名详解
May 30 #Javascript
Vue CLI3中使用compass normalize的方法
May 30 #Javascript
通过实践编写优雅的JavaScript代码
May 30 #Javascript
AngularJs中$cookies简单用法分析
May 30 #Javascript
JS使用new操作符创建对象的方法分析
May 30 #Javascript
You might like
解析PHP可变函数的经典用法
2013/06/20 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
python常用知识梳理(必看篇)
2017/03/23 Python
Django如何配置mysql数据库
2018/05/04 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
印尼网上商店:Alfacart.com
2019/03/11 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
高中军训感想800字
2014/02/23 职场文书
愚人节活动策划方案
2014/03/11 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
个人委托书格式
2014/04/04 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
先进学校事迹材料
2014/12/30 职场文书
志愿服务心得体会
2016/01/15 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫