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 相关文章推荐
javascript div 遮罩层封锁整个页面
Jul 10 Javascript
JQuery与iframe交互实现代码
Dec 24 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
Dec 15 Javascript
javascript自动改变文字大小和颜色的效果的小例子
Aug 02 Javascript
json数据的列循环示例
Sep 06 Javascript
js动态修改input输入框的type属性(实现方法解析)
Nov 13 Javascript
解析JavaScript中的不可见数据类型
Dec 02 Javascript
jQuery中dom元素上绑定的事件详解
Apr 24 Javascript
详解AngularJS验证、过滤器、指令
Jan 04 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
vue store之状态管理模式的详细介绍
Jun 13 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
Jul 18 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中Date获取时间不正确怎么办
2008/06/05 PHP
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
php实现的二分查找算法示例
2017/06/20 PHP
Nginx下ThinkPHP5的配置方法详解
2017/08/01 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
Jquery.addClass始终无效原因分析
2013/09/08 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
javascript模块化简单解析
2016/04/07 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
react build 后打包发布总结
2018/08/24 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
python实现飞机大战项目
2020/03/11 Python
HashMap和Hashtable的区别
2013/05/18 面试题
自荐信的五个重要部分
2013/10/29 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
个人贷款担保书
2014/04/01 职场文书
招标承诺书
2014/08/30 职场文书
反腐倡廉观后感
2015/06/08 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang