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 相关文章推荐
JQuery+JS实现仿百度搜索结果中关键字变色效果
Aug 02 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
Jan 20 Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
javascript实现日期按月份加减
May 15 Javascript
EasyUI学习之DataGird分页显示数据
Dec 29 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
Feb 05 Javascript
Vue.js结合bootstrap实现分页控件
Mar 10 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
AngularJS基于http请求实现下载php生成的excel文件功能示例
Jan 23 Javascript
详解vue-cli3 中跨域解决方案
Apr 10 Javascript
javascript实现贪吃蛇小练习
Jul 05 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 什么是PEAR?(第三篇)
2009/03/19 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
html5的localstorage详解
2017/05/09 HTML / CSS
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
几道PHP的面试题
2012/05/19 面试题
关工委先进个人事迹材料
2014/05/23 职场文书
政风行风评议工作总结
2014/10/21 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
react合成事件与原生事件的相关理解
2021/05/13 Javascript
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android