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 相关文章推荐
JS中的this变量的使用介绍
Oct 21 Javascript
自定义的一个简单时尚js下拉选择框
Nov 20 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
Apr 15 Javascript
jquery使用经验小结
May 20 Javascript
js控制TR的显示隐藏
Mar 04 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
Aug 19 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
Vue作用域插槽slot-scope实例代码
Sep 05 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
Sep 20 jQuery
微信小程序HTTP请求从0到1封装
Sep 09 Javascript
详解vue3.0 的 Composition API 的一种使用方法
Oct 26 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
Zerg基本策略
2020/03/14 星际争霸
php数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
javascript表单正则应用
2017/02/04 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
深入理解webpack process.env.NODE_ENV配置
2020/02/23 Javascript
vue实现购物车加减
2020/05/30 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python操作使用MySQL数据库的实例代码
2017/05/25 Python
Python自定义线程类简单示例
2018/03/23 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
婚庆公司计划书
2014/09/15 职场文书
考研英语复习计划
2015/01/19 职场文书
学年个人总结范文
2015/03/05 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
外出培训学习心得体会
2016/01/18 职场文书