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 Dialog 去掉右上角的X关闭功能
Apr 23 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
Sep 01 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
基于原生JS实现图片裁剪
Aug 01 Javascript
关于js二维数组和多维数组的定义声明(详解)
Oct 02 Javascript
Vuejs实现带样式的单文件组件新方法
May 02 Javascript
javascript实现延时显示提示框效果
Jun 01 Javascript
利用jsonp与代理服务器方案解决跨域问题
Sep 14 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
Oct 12 Javascript
微信小程序http连接访问解决方案的示例
Nov 05 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
深入了解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命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
JavaScript 学习笔记之变量及其作用域
2015/01/14 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
vue获取当前点击的元素并传值的实例
2018/03/09 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
python版本五子棋的实现代码
2018/12/11 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
美国糖果店:Sugarfina
2019/02/21 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
高二美术教学反思
2014/01/14 职场文书
高一英语教学反思
2014/01/22 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
2014年内部审计工作总结
2014/12/09 职场文书
2015年勤工助学工作总结
2015/04/29 职场文书
离婚被告答辩状
2015/05/22 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript