egg.js整合socket.io
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了egg.js整合socket.io相关的知识,希望对你有一定的参考价值。
参考技术A ##### 什么是Socket.io一个基于 Node.js 的实时应用程序框架,在即时通讯、通知与消息推送,实时分析等场景中有较为广泛的应用
##### 什么是egg-socket.io
- 对socket.io的二次封装, 增加了一些开发规范
- 增加namespace(命名空间), 可以通过配置的方式定义
- 增加middleware, 对每一次socket连接的建立、断开、消息和数据传递进行预处理
- controller, 相应socket.io的event事件
- router, 同一了socket.io的event与框架路由的处理配置方式
##### 把egg-socket.io整合到我们的egg项目中
不知道怎么搭建egg项目的翻下以前的文章
- 安装egg-socket.io
```
cnpm i egg-socket.io -S
```
- 开启插件
app_root/config/plugin.js
```
exports.io =
enable: true,
package: 'egg-socket.io',
;
```
- 配置egg-socket.io
app_root/config/config.default.js
```
module.exports = appInfo =>
const config = exports =
io:
# namespace命名空间配置为/
namespace:
'/':
# 预处理器中间件, 我们这里配置了一个auth, 进行权限判断, 它对应的文件是/app/io/middleware/auth.js, 这里可以配置多个文件, 用逗号隔开
connectionMiddleware: ['auth'], #这里我们可以做一些权限校验之类的操作
packetMiddleware: [], # 通常用于对消息做预处理,又或者是对加密消息的解密等操作
,
,
# 配置redis, 非必须, 不需要的可以不配置这块, egg-socket.io内置了socket-io-redis, 在cluster模式下, 使用redis可以较为简单的实现clients/rooms等信息共享
redis:
host: 'ip地址',
prot: 6379,
auth_pass: 123456,
db:0,
;
省略 .....
;
```
到这里egg-socket.io已经开启并配置完毕了, 接下来我们就要编写路由和控制器了
- 先来看下egg-socket.io的项目目录结构
```
your-project-name
├── app
│ ├── extend
│ │ └── helper.js
│ ├── io
│ │ ├── controller
│ │ │ └── chat.js
│ │ └── middleware #插件中间件, 基于 socket 模型设计,处理 socket.io 请求
│ │ ├── auth.js #对应刚才配置的connectionMiddleware: ['auth']
│ └── router.js
├── config
└── package.json
```
- 先配置路由
/app/router.js
```
module.exports = app =>
const router, controller, io = app;
//http 接口, 在对应的控制器中可以直接操作socket, 非常方便
router.get('/', controller.home.index);
router.get('/user', controller.user.index);
// socket, 指向app/io/controller/chat.js的index方法
io.route('chat', app.io.controller.chat.index);
;
```
- 然后创建auth.js
app/io/middleware/auth.js
```
const room = "default_room";
module.exports = () =>
return async(ctx, next) =>
// 权限校验通过
ctx.socket.emit('res', 'auth success');
// 加入房间
socket.join(room);
// 放行
await next();
console.log('断开连接');
;
```
- 最后创建聊天控制器
app/io/controller/chat.js
```
'use strict';
const Controller = require('egg').Controller;
const room = 'default_room';
class ChatController extends Controller
async index()
const app, socket, logger, helper = this.ctx;
const id = socket.id;
// 根据id给指定连接发送消息
nsp.sockets[id].emit('res', "hello ....");
// 指定房间连接信息列表
nsp.adapter.clients([room], (err, clients) =>
console.log(JSON.stringify(clients));
);
// 给指定房间的每个人发送消息
this.ctx.app.io.of('/').to(room).emit('online', this.ctx.socket.id+ "上线了");
// 断开连接
this.ctx.socket.disconnect();
module.exports = ChatController;
```
- 通过调用http接口给客户端发送消息
说白了就是在http接口的控制器中发送socket消息
app/controller/home.js
```
const Controller = require('egg').Controller;
class HomeController extends Controller
async index()
const app, query = this.ctx;
// 给谁发, socket连接的id
const id = query.id;
const nsp = app.io.of('/');
if(nsp.sockets[id])
// 通过id给指定socket连接发送消息
nsp.sockets[id].emit('res', 'hello http....');
this.ctx.body = "发送成功";
module.exports = HomeController;
```
到这里服务端完成, 下面我们来写一个简单的socket.io客户端
```
const socket = require('socket.io-client')('http://127.0.0.1:7001');
// 连接服务端
socket.on('connect', () =>
console.log('connect!');
socket.emit('chat', 'hello world!');
);
//接收消息通知
socket.on('res', msg =>
console.log('res from server: %s!', msg);
);
// 接收上线通知
socket.on('online', msg=>
console.log('online from server: %s!', msg);
);
```
到这就结束了, 有问题留言!!!
Egg.js 介绍以及环境搭建
1、Egg.js 官网:
2、Egg.js 是什么?
Egg.js 是《阿里旗下产品》基于 Node.js 和 Koa 是一个 Nodejs 的企业级应用开发框架。 可以帮助发团队和开发人员降低开发和维护成本。
Express 和 Koa 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项 目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行 开发,奉行『约定优于配置』,团队协作成本低。
Egg.js 基于 Es6、Es7 以及 Typescript、Koa2 使得 Nodejs 具有更规范的开发模式、更低 的学习成本、更优雅的代码、更少的开发成本、更少的维护成本。为企业级框架而生。
3、Egg.js 的特性:
1、提供基于 Egg 定制上层框架的能力
2、高度可扩展的插件机制
3、内置多进程管理
4、基于 Koa 开发,性能优异
5、框架稳定,测试覆盖率高
6、渐进式开发
4、Egg.js 的历史?
2013 年蚂蚁的 chair 框架,可以视为 egg 的前身。
2015 年 11 月,在苏千的召集下,阿里各 BU 的前端骨干齐聚黄龙,闭门共建。
2016 年初,各 BU 的基础 web 框架完成升级,在同一套规范的基础上进行差异化定
制。
2016 年中,广泛使用在绝大部分阿里的前端 Node.js 应用。
2016 年 09 月,在 JSConf China 2016 上亮相并宣布开源。
2017 年初,官网文档 egg - 为企业级框架和应用而生 亮相,并将在本月发布 egg@1.0
版本。
2017 年 12 月左右 Egg 社区版 2.0 正式发布,性能提升 30%,基于 koa2 拥抱 Async
2018 年 7 月最新 egg 的版本是 2.2.1
经过几年的沉淀 Egg 已经非常成熟,下面让我们一起开启 Egg 的学习之旅。
5.安装 egg 脚手架以及使用 egg-init 创建项目
$ npm i egg-init -g
$ egg-init egg-example --type=simple $ cd egg-example
$ npm i
运行项目
$ npm run dev
$ open localhost:7001
以上是关于egg.js整合socket.io的主要内容,如果未能解决你的问题,请参考以下文章