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 介绍以及环境搭建

1Egg.js 官网:

官 网:https://eggjs.org

中文网站:https://eggjs.org/zh-cn/

2Egg.js 是什么?

Egg.js 是《阿里旗下产品》基于 Node.js Koa 是一个 Nodejs 的企业级应用开发框架。 可以帮助发团队和开发人员降低开发和维护成本。

Express Koa Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项 目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行 开发,奉行『约定优于配置』,团队协作成本低。

Egg.js 基于 Es6Es7 以及 TypescriptKoa2 使得 Nodejs 具有更规范的开发模式、更低 的学习成本、更优雅的代码、更少的开发成本、更少的维护成本。为企业级框架而生

3Egg.js 的特性:

1、提供基于 Egg 定制上层框架的能力

2、高度可扩展的插件机制

3、内置多进程管理

4、基于 Koa 开发,性能优异

5、框架稳定,测试覆盖率高

6、渐进式开发

4Egg.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的主要内容,如果未能解决你的问题,请参考以下文章

创建一个egg.js项目

Node.js学习9~Egg.js框架学习和部署实战

Egg.js搭建后台服务API

使用egg.js和egg-sequelize连接mysql

egg.js 中使用 egg-mysql 操作 mysql 数据库

Egg.js 介绍以及环境搭建