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小玩意 几个属性相加不能超过一个特定值.
Sep 29 Javascript
js中settimeout方法加参数
Feb 28 Javascript
JavaScript模块随意拖动示例代码
May 27 Javascript
JQuery中使文本框获得焦点的方法实例分析
Feb 28 Javascript
jQuery实现的多级下拉菜单效果代码
Aug 24 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
AngularJS中的指令全面解析(必看)
May 20 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
Nov 07 Javascript
简单实现jquery焦点图
Dec 12 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
小程序视频列表中视频的播放与停止的示例代码
Jul 20 Javascript
Vue核心概念Action的总结
Jan 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 魔术函数使用说明
2010/05/14 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
django ajax json的实例代码
2018/05/29 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
审计专业自荐信范文
2014/04/21 职场文书
党员个人自我剖析材料
2014/10/08 职场文书
导游词之西安骊山
2019/12/20 职场文书
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL